web-dev-qa-db-ja.com

与えられたキーがすでに辞書に存在するかどうかを確認

キーの値を更新する前に、キーが辞書に存在するかどうかをテストしたいと思いました。

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

これは、このタスクを実行するための最善の方法ではないと思います。辞書のキーをテストするより良い方法はありますか?

2521
Mohan Gulati

inは、dict内のキーの存在をテストするための意図された方法です。

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

デフォルトが欲しいなら、いつでもdict.get()を使うことができます:

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

...そして、もしあなたが常にどんなキーにもデフォルト値を確保したいのなら、defaultdictモジュールからcollectionsを使うことができます。

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

...しかし一般的には、inキーワードがそれを実行するための最良の方法です。

2587
Chris B.

キーを呼び出す必要はありません。

if 'key1' in dict:
  print "blah"
else:
  print "boo"

キーを呼び出すのと同じように線形検索を行うのではなく、辞書のハッシュを使うので、これは非常に 高速 になります。

1257
Jason Baker

あなたは辞書を使ってキーの存在をテストすることができます。  キーワード:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

変更前に辞書内のキーの存在をチェックする一般的な用途は、値をデフォルトで初期化することです(例えば、値がリストで、追加できる空のリストがあることを確認したい場合など)キーの最初の値を挿入するとき)そのような場合には、 collections.defaultdict() タイプが重要であることがわかります。

古いコードでは、辞書内のキーの存在をチェックするための廃止予定のメソッドであるhas_key()の使い方もいくつかあります(代わりにkey_name in dict_nameを使用してください)。

240

これを短くすることができます:

if 'key1' in dict:
    ...

しかし、これはせいぜい化粧品の改善です。なぜあなたはこれが最善の方法ではないと思いますか?

82
Greg Hewgill

代わりにsetdefaultメソッドを使用することをお勧めします。それはあなたが望むすべてのことをするように聞こえます。

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}
44
David Berger

承認された回答の提案された方法の高速実行に関する追加情報(10mループ):

  • 'key' in mydict経過時間1.07秒
  • mydict.get('key')経過時間1.84秒
  • mydefaultdict['key']経過時間1.07秒

したがって、inまたはdefaultdictの使用は、getに対して推奨されます。

40
Wtower

Pythonの辞書にはget( 'key'、default)メソッドがあります。そのため、キーがない場合に備えてデフォルト値を設定できます。 

values = {...}
myValue = values.get('Key', None)
39
mafonya

EAFPを使用することについてはどうですか(許可より許しを求める方が簡単です)

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

他のSO記事を参照してください。

Pythonでif vsを使用する または

Pythonでメンバーの存在を確認する

24
HungryArthur

三項演算子を使用する:

message = "blah" if 'key1' in dict else "booh"
print(message)
21
Charitoo

確認にはhas_key()メソッドが使えます 

if dict.has_key('key1'):
   print "it is there"

値が必要な場合はget()メソッドを使用できます

a = dict.get('key1', expeced_type)

戻り値としてデフォルト値としてTuple、リスト、辞書、または任意の文字列が必要な場合はget()メソッドを使用

a = dict.get('key1', {}).get('key2', [])
18
Debabrata

結果を取得する方法は次のとおりです。

どちらが良いかは3つのことに依存します:

  1. 辞書は「通常キーを持っている」か「通常キーを持っていない」か。
  2. If ... else ... elseif ... elseのような条件を使用しますか?
  3. 辞書の大きさは?

続きを読む: http://paltman.com/try-except-performance-in-python-a-simple-test/ /

'in'や 'if'の代わりにtry/blockを使う:

try:
    my_dict_of_items[key_i_want_to_check]
except KeyError:
    # Do the operation you wanted to do for "key not present in dict".
else:
    # Do the operation you wanted to do with "key present in dict."
15
Bishwas Mishra

ちょっとFYIクリスに追加します。 B(ベストアンサー):

d = defaultdict(int)

同様に動作します。その理由は、int()を呼び出すと0が返されるためです。これは、(辞書を構築するときに)defaultdictが背後で行うことです。したがって、マニュアルでは "Factory Function"という名前です。

14

has_key()メソッドを使うことができます:

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

または見つからない場合はデフォルト値を設定するdict.getメソッド:

mydict = {"a": 5}

print mydict["a"]            #prints 5
print mydict["b"]            #Throws KeyError: 'b'

print mydict.get("a", 0)     #prints 5
print mydict.get("b", 0)     #prints 0
12
wan kenobi

print dict.get('key1', 'blah')

辞書の中の値に対してbooを表示しませんが、代わりにkey1の値を表示してそれが存在することを確認して、目的を達成します。

7
gounc86

Python辞書には__contains__というメソッドがあります。辞書にキーがある場合、このメソッドはTrueを返します。

 >>> temp = {}

 >>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.
5
Siva Gnanam

特定のキーが辞書に存在するかどうかを確認するには、以下のいずれかの方法を使用してください

アプローチ1(Python 3で作業中):

def checkKey(dict, key):    
    if key in dict.keys(): 
        print("Key is here, ", end =" ") 
        print("value =", dict[key]) 
    else: 
        print("Key isn't present.") 

確認しましょう。

dict = {'r': 30, 'g':59, 'b':11} 

key = 'b'
checkKey(dict, key) 

key = 'a'
checkKey(dict, key) 

Approach Oneの結果:

# Key is here, value = 11
# Key isn't present.

アプローチ2(Python 3で作業中):

def checkKey(dict, key):   
    if key in dict: 
        print("Key is here, ", end =" ") 
        print("value =", dict[key]) 
    else: 
        print("Key isn't present.") 

それもチェックしましょう。 

dict = {'x': 10, 'y':20, 'z':30} 

key = 'y'
checkKey(dict, key) 

key = 'u'
checkKey(dict, key) 

Approach Twoの結果:

# Key is here, value = 20
# Key isn't present.

アプローチ3(Python 3で作業中):

def checkKey(dict, key):      
    if dict.has_key(key): 
        print "Key is here, value =", dict[key] 
    else: 
        print "Key isn't present."

同様にそれをチェックしましょう:

dict = {'u': 0, 'v':1, 'w':2} 

key = 'u'
checkKey(dict, key) 

key = 'm'
checkKey(dict, key)

Approach Threeの結果:

# Key is here, value = 0
# Key isn't present.

お役に立てれば。

4
ARGeo

ブール演算子を使用してキーが存在するかどうかを確認するもう1つの方法を共有します。

d = {'a': 1, 'b':2}
keys = 'abcd'

for k in keys:
    x = (k in d and 'blah') or 'boo'
    print(x) 

これは戻る

>>> blah
>>> blah
>>> boo
>>> boo

説明

まず、Pythonでは、0None、または長さゼロのオブジェクトがFalseに評価されることを知っておく必要があります。それ以外のものはすべてTrueと評価されます。ブール演算は左から右に評価され、TrueまたはFalseではなくオペランドを返します。

例を見てみましょう。

>>> 'Some string' or 1/0 
'Some string'
>>>

'Some string'Trueと評価されるので、残りのorは評価されず、ゼロによる除算エラーは発生しません。

しかし、順番を入れ替えると1/0が最初に評価され、例外が発生します。

>>> 1/0 or 'Some string'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 

これは、キーが存在するかどうかをチェックするためのパターンに使用できます。

(k in d and 'blah')

と同じ

if k in d:
    'blah'
else:
    False

キーが存在する場合、これはすでに正しい結果を返しますが、存在しない場合は 'boo'を印刷したいと思います。だから、私たちは結果を取り、それを'boo'orします

>>> False or 'boo'
'boo'
>>> 'blah' or 'boo'
'blah'
>>> 
3
J. Antunes

そうですね。リストやデータ内の要素の存在を検索することは、すべて試しに行くことを意味します(少なくとも番号なしのリスト、例えばdict.keysなど)。

d={1:'a',2:'b'}
try:
    needed=d[3]
    print(needed)
except:
    print("Key doesnt exist")
3
Seenivasan

最も簡単な方法は、どのキー(キー名)を探すべきかわかっている場合です。

# suppose your dictionary is
my_dict = {'foo': 1, 'bar': 2}
# check if a key is there
if 'key' in my_dict.keys():   # it will evaluates to true if that key is present otherwise false.
    # do something

あるいは、単に次のようにすることもできます。

if 'key' in my_dict:   # it will evaluates to true if that key is present otherwise false.
    # do something
1
Tasneem Haider

try/except を使用します。例外が投げられた場合、そのキーは辞書に存在しません。例:

st = 'sdhfjaks'
d = {}
try:
    print d['st']
except Exception, e:
    print 'Key not in the dictionary'
1
Leonardo Maffei

与えられたキーがすでに辞書に存在するかどうかを確認します

その方法を理解するために、まず辞書でどのメソッドを呼び出すことができるかを調べます。方法は次のとおりです。

d={'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

Python Dictionary clear()       Removes all Items
Python Dictionary copy()        Returns Shallow Copy of a Dictionary
Python Dictionary fromkeys()    Creates dictionary from given sequence
Python Dictionary get()         Returns Value of The Key
Python Dictionary items()       Returns view of dictionary (key, value) pair
Python Dictionary keys()        Returns View Object of All Keys
Python Dictionary pop()         Removes and returns element having given key
Python Dictionary popitem()     Returns & Removes Element From Dictionary
Python Dictionary setdefault()  Inserts Key With a Value if Key is not Present
Python Dictionary update()      Updates the Dictionary 
Python Dictionary values()      Returns view of all values in dictionary

キーが既に存在するかどうかを調べるための残酷な方法はget()メソッドです。

d.get("key")

他の2つの おもしろい メソッドitems()keys()は、やり過ぎのように思えます。それではget()が正しい方法であるかどうか調べてみましょう。 dという辞書があります。

d= {'clear':0, 'copy':1, 'fromkeys':2, 'get':3, 'items':4, 'keys':5, 'pop':6, 'popitem':7, 'setdefault':8, 'update':9, 'values':10}

表示していないキーを印刷するとNoneが返されます。

print(d.get('key')) #None
print(d.get('clear')) #0
print(d.get('copy')) #1

我々 5月 キーが存在するかどうかにかかわらず、情報を取得するためにそれを使用してください。単一のkey:Noneで辞書を作成するなら、これを考えてください:

d= {'key':None}
print(d.get('key')) #None
print(d.get('key2')) #None

いくつかの値がNoneである可能性がある場合、get()メソッドをリードすることは信頼できません。この物語はもっと幸せな結末になるはずです。 inコンパレータを使うならば:

print('key' in d) #True
print('key2' in d) #False

正しい結果が得られます。 Pythonのバイトコードを調べます。

import dis
dis.dis("'key' in d")
#   1           0 LOAD_CONST               0 ('key')
#               2 LOAD_NAME                0 (d)
#               4 COMPARE_OP               6 (in)
#               6 RETURN_VALUE

dis.dis("d.get('key2')")
#   1           0 LOAD_NAME                0 (d)
#               2 LOAD_METHOD              1 (get)
#               4 LOAD_CONST               0 ('key2')
#               6 CALL_METHOD              1
#               8 RETURN_VALUE

これは、inの比較演算子がget()よりも信頼性が高いだけでなく、さらに速いことを示しています。

1
prosti

Forループを使用して各要素を辞書に入れ、辞書で見つけたい名前を取得します。その後、それが存在するかどうかを確認します。 

dic={‘first’ : 12, ‘second’ : 123}
For each in dic :
If each == ‘second’: 
    Print (‘it is exist’)
else :
     print (‘not exist’)
0
Abdulkalek