辞書に値が存在するかどうかを確認する方法(Python)


251

私はPythonで次の辞書を持っています:

d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}

この辞書に「1」や「2」などの値が存在するかどうかを確認する方法が必要です。

たとえば、インデックス「1」が存在するかどうかを知りたい場合は、次のように入力するだけです。

"1" in d

そして、それが真か偽かをPythonが教えてくれますが、値が存在するかどうかを見つけることを除いて、まったく同じことをする必要があります。

回答:


381
>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True

好奇心から、いくつかの比較タイミング:

>>> T(lambda : 'one' in d.itervalues()).repeat()
[0.28107285499572754, 0.29107213020324707, 0.27941107749938965]
>>> T(lambda : 'one' in d.values()).repeat()
[0.38303399085998535, 0.37257885932922363, 0.37096405029296875]
>>> T(lambda : 'one' in d.viewvalues()).repeat()
[0.32004380226135254, 0.31716084480285645, 0.3171098232269287]

編集:そしてなぜあなたが不思議に思った場合...理由は、上記のそれぞれが異なるタイプのオブジェクトを返すためです。これは、ルックアップ操作に適している場合とそうでない場合があります:

>>> type(d.viewvalues())
<type 'dict_values'>
>>> type(d.values())
<type 'list'>
>>> type(d.itervalues())
<type 'dictionary-valueiterator'>

EDIT2:コメントの要求に従って...

>>> T(lambda : 'four' in d.itervalues()).repeat()
[0.41178202629089355, 0.3959040641784668, 0.3970959186553955]
>>> T(lambda : 'four' in d.values()).repeat()
[0.4631338119506836, 0.43541407585144043, 0.4359898567199707]
>>> T(lambda : 'four' in d.viewvalues()).repeat()
[0.43414998054504395, 0.4213531017303467, 0.41684913635253906]

手元にpythonがありません。「1」ではなく「4」でテストを再実行できますか?
soulcheck

2
大きな辞書で実行しない限り、結局それは必需品ではありませんでした。values()のオーバーヘッドは、値リストをコピーすることによって発生し、viewvalues()でビューを維持することによって発生すると思います。
soulcheck

のサイズが小さい場合d、タイミングは実質的に無意味です。Python 3では、dict.values()デフォルトでディクショナリビューでありdict.itervalues()、現在dict.viewvalues()は存在しません。これを(より大きな辞書で)再テストし、を使用list(d.values())してPython 2の動作iter(d.values())を取得し、dict.itervalues()動作を取得することもできますが、これらのバージョンは両方ともグローバルなルックアップと呼び出しが必要であるため、絶対的に遅くなります。どちらも不要な余分な作業を行います。
Martijn Pieters


22

Python辞書にはget(key)関数があります

>>> d.get(key)

例えば、

>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> d.get('3')
'three'
>>> d.get('10')
none

キーが存在しない場合は、none値を返します。

foo = d[key] # raise error if key doesn't exist
foo = d.get(key) # return none if key doesn't exist

3.0未満および5.0を超えるバージョンに関連するコンテンツ。。


29
質問には答えません。OPはkey:valueキーではなく、値を尋ねました。
akshaynagpal 2017


4

値をチェックするためのさまざまなタイプが存在します

d = {"key1":"value1", "key2":"value2"}
"value10" in d.values() 
>> False

値の一覧の場合

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6']}
"value4" in [x for v in test.values() for x in v]
>>True

文字列値を持つ値のリストの場合

test = {'key1': ['value4', 'value5', 'value6'], 'key2': ['value9'], 'key3': ['value6'], 'key5':'value10'}
values = test.values()
"value10" in [x for v in test.values() for x in v] or 'value10' in values
>>True

他の目的で使用しないリストオブジェクトの作成を避け、値が見つかったときに短絡するためにvalue in [... list comprehension over sequence ...]、を使用しないでくださいany(value in sequence ...)
Martijn Pieters

0

Python 3ではvalues()、辞書の機能を使用できます。値のビューオブジェクトを返します。次に、これをiterイテレータオブジェクトを返す関数に渡すことができます。イテレータはin、次のようにを使用して確認できます。

'one' in iter(d.values())

または、ビューオブジェクトはリストに似ているため、直接使用できます。

'one' in d.values()

1
辞書ビューで使用しても意味がありませんiter()inオブジェクトはすでにイテラブルとして使用されます(型は専用__contains__メソッドを実装していません)。との唯一の違いは'one' in iter(d.values())'one in d.values()Pythonに追加の処理を行わせることです(のグローバルルックアップのコストを支払いますiter)。
Martijn Pieters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.