キーの値を更新する前に、キーが辞書に存在するかどうかをテストしたいと思いました。
if 'key1' in dict.keys():
print "blah"
else:
print "boo"
これは、このタスクを実行するための最善の方法ではないと思います。辞書のキーをテストするより良い方法はありますか?
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
キーワードがそれを実行するための最良の方法です。
キーを呼び出す必要はありません。
if 'key1' in dict:
print "blah"
else:
print "boo"
キーを呼び出すのと同じように線形検索を行うのではなく、辞書のハッシュを使うので、これは非常に 高速 になります。
あなたは辞書を使ってキーの存在をテストすることができます。 に キーワード:
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
を使用してください)。
これを短くすることができます:
if 'key1' in dict:
...
しかし、これはせいぜい化粧品の改善です。なぜあなたはこれが最善の方法ではないと思いますか?
代わりに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}
承認された回答の提案された方法の高速実行に関する追加情報(10mループ):
'key' in mydict
経過時間1.07秒mydict.get('key')
経過時間1.84秒mydefaultdict['key']
経過時間1.07秒したがって、in
またはdefaultdict
の使用は、get
に対して推奨されます。
Pythonの辞書にはget( 'key'、default)メソッドがあります。そのため、キーがない場合に備えてデフォルト値を設定できます。
values = {...}
myValue = values.get('Key', None)
EAFPを使用することについてはどうですか(許可より許しを求める方が簡単です)
try:
blah = dict["mykey"]
# key exists in dict
except KeyError:
# key doesn't exist in dict
他のSO記事を参照してください。
三項演算子を使用する:
message = "blah" if 'key1' in dict else "booh"
print(message)
確認には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', [])
結果を取得する方法は次のとおりです。
どちらが良いかは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."
ちょっとFYIクリスに追加します。 B(ベストアンサー):
d = defaultdict(int)
同様に動作します。その理由は、int()
を呼び出すと0
が返されるためです。これは、(辞書を構築するときに)defaultdict
が背後で行うことです。したがって、マニュアルでは "Factory Function"という名前です。
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
print dict.get('key1', 'blah')
辞書の中の値に対してbooを表示しませんが、代わりにkey1の値を表示してそれが存在することを確認して、目的を達成します。
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.
特定のキーが辞書に存在するかどうかを確認するには、以下のいずれかの方法を使用してください
アプローチ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.
お役に立てれば。
ブール演算子を使用してキーが存在するかどうかを確認するもう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では、0
、None
、または長さゼロのオブジェクトが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'
>>>
そうですね。リストやデータ内の要素の存在を検索することは、すべて試しに行くことを意味します(少なくとも番号なしのリスト、例えばdict.keysなど)。
d={1:'a',2:'b'}
try:
needed=d[3]
print(needed)
except:
print("Key doesnt exist")
最も簡単な方法は、どのキー(キー名)を探すべきかわかっている場合です。
# 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
try/except を使用します。例外が投げられた場合、そのキーは辞書に存在しません。例:
st = 'sdhfjaks'
d = {}
try:
print d['st']
except Exception, e:
print 'Key not in the dictionary'
与えられたキーがすでに辞書に存在するかどうかを確認します
その方法を理解するために、まず辞書でどのメソッドを呼び出すことができるかを調べます。方法は次のとおりです。
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()
よりも信頼性が高いだけでなく、さらに速いことを示しています。
Forループを使用して各要素を辞書に入れ、辞書で見つけたい名前を取得します。その後、それが存在するかどうかを確認します。
dic={‘first’ : 12, ‘second’ : 123}
For each in dic :
If each == ‘second’:
Print (‘it is exist’)
else :
print (‘not exist’)