特定のキーが辞書にすでに存在するかどうかを確認します

2009年10月22日に質問されました。  ·  閲覧回数 4M回  ·  ソース

Mohan Gulati picture
2009年10月22日

キーの値を更新する前に、キーが辞書に存在するかどうかをテストしたかったのです。 私は次のコードを書きました:

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

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

回答

Chris B. picture
2009年10月22日
3774

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

d = {"key1": 10, "key2": 23}

if "key1" in d:
    print("this will execute")

if "nonexistent key" in d:
    print("this will not")

デフォルトが必要な場合は、いつでもdict.get()使用できます。

d = dict()

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

また、キーのデフォルト値を常に確認したい場合は、次のように、 dict.setdefault()繰り返し使用するか、 collectionsモジュールからdefaultdictを使用できます。

from collections import defaultdict

d = defaultdict(int)

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

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

Jason Baker picture
2009年10月22日
1582

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

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

キーを呼び出す場合の線形検索とは対照的に、辞書のハッシュを使用するため、はるかに高速になります。

Michael Aaron Safyan picture
2009年10月22日
275

inキーワードを使用して、辞書にキーが存在するかどうかをテストできます。

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を使用してください)。

Greg Hewgill picture
2009年10月22日
103

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

if 'key1' in dict:
    ...

ただし、これはせいぜい見た目の改善です。 なぜこれが最善の方法ではないと思いますか?

Wtower picture
2015年05月29日
66

受け入れられた回答の提案された方法(10mループ)の実行速度に関する追加情報:

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

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

David Berger picture
2009年10月22日
59

代わりに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}
mafonya picture
2017年03月01日
48

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

values = {...}
myValue = values.get('Key', None)
HungryArthur picture
2014年02月07日
35

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

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

他のSO投稿を参照してください:

Pythonまたは

Pythonでのメンバーの存在の確認

Charitoo picture
2017年08月19日
29

三項演算子の使用:

message = "blah" if 'key1' in dict else "booh"
print(message)
Bishwas Mishra picture
2016年12月21日
21

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

  • your_dict.has_key(key)がPython3で削除された場合
  • your_dictを入力した場合
  • ブロックを試す/除外する

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

  1. 辞書は「通常はキーを持っていますか」または「通常はキーを持っていません」。
  2. if ... else ... elseif ... elseのような条件を使用するつもりですか?
  3. 辞書の大きさはどれくらいですか?

続きを読む: http

'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."