So überprüfen Sie, ob ein Wert in einem Wörterbuch (Python) vorhanden ist

251

Ich habe das folgende Wörterbuch in Python:

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

Ich muss herausfinden, ob in diesem Wörterbuch ein Wert wie "eins" oder "zwei" vorhanden ist.

Wenn ich zum Beispiel wissen wollte, ob der Index "1" existiert, müsste ich einfach Folgendes eingeben:

"1" in d

Und dann würde Python mir sagen, ob das wahr oder falsch ist, aber ich muss genau dasselbe tun, außer um herauszufinden, ob ein Wert existiert.

JimmyK
quelle

Antworten:

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

Aus Neugier ein vergleichendes Timing:

>>> 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]

EDIT: Und falls Sie sich fragen, warum ... der Grund ist, dass jeder der oben genannten einen anderen Objekttyp zurückgibt, der für Suchvorgänge gut geeignet sein kann oder nicht:

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

EDIT2: Gemäß Anfrage in Kommentaren ...

>>> 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]
Mac
quelle
Ich habe keine Python zur Hand. Könnten Sie die Tests mit "vier" anstelle von "eins" wiederholen?
Soulcheck
2
es war schließlich nicht notwendig, es sei denn, es wurde ein größeres Diktat angewendet. Ich denke, der Overhead in values ​​() wird durch das Kopieren der Werteliste und in viewvalues ​​() durch das Aufrechterhalten der Ansicht verursacht.
Soulcheck
Angesichts der geringen Größe von dsind die Timings praktisch bedeutungslos. In Python 3 dict.values()ist standardmäßig eine Wörterbuchansicht vorhanden, und dict.itervalues()und dict.viewvalues()sind verschwunden. Sie können dies erneut testen (mit einem größeren Wörterbuch) und verwenden list(d.values()), um das Python 2-Verhalten und iter(d.values())das dict.itervalues()Verhalten abzurufen. Da beide Versionen jedoch eine globale Suche und einen globalen Aufruf erfordern, sind sie absolut langsamer. Beide erledigen zusätzliche Arbeit, die nicht benötigt wird.
Martijn Pieters
33

Sie können verwenden

"one" in d.itervalues()

um zu testen, ob "one"es zu den Werten Ihres Wörterbuchs gehört.

Sven Marnach
quelle
23

Das Python-Wörterbuch hat eine (Schlüssel-) Funktion

>>> d.get(key)

Beispielsweise,

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

Wenn Ihr Schlüssel nicht vorhanden ist, wird ein noneWert zurückgegeben.

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

Inhalt, der für Versionen unter 3.0 und höher als 5.0 relevant ist. .

Shameem
quelle
29
Beantwortet die Frage nicht. OP fragte nach einem Wert wie in key:valueund nicht nach einem Schlüssel.
Akshaynagpal
10

Verwenden Sie Wörterbuchansichten:

if x in d.viewvalues():
    dosomething()..
Soulcheck
quelle
4

Es gibt verschiedene Typen zur Überprüfung der Werte

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

Was ist, wenn Liste der Werte

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

Was ist, wenn eine Liste von Werten mit Zeichenfolgenwerten

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
sim
quelle
Verwenden Sie value in [... list comprehension over sequence ...], verwenden Sie any(value in sequence ...), um zu vermeiden, dass ein Listenobjekt erstellt wird, das Sie für nichts anderes verwenden, und um einen Kurzschluss zu verursachen, wenn der Wert gefunden wurde.
Martijn Pieters
0

In Python 3 können Sie die values()Funktion des Wörterbuchs verwenden. Es gibt ein Ansichtsobjekt der Werte zurück. Dies kann wiederum an die iterFunktion übergeben werden, die ein Iteratorobjekt zurückgibt. Der Iterator kann folgendermaßen überprüft werden in:

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

Sie können das Ansichtsobjekt auch direkt verwenden, da es einer Liste ähnelt

'one' in d.values()
Reed Richards
quelle
1
Es macht keinen Sinn , iter()eine Wörterbuchansicht zu verwenden. inverwendet das Objekt bereits als iterable (der Typ implementiert keine dedizierte __contains__Methode). Der einzige Unterschied zwischen 'one' in iter(d.values())und 'one in d.values()besteht darin, dass Sie Python dazu gebracht haben, zusätzliche Arbeit zu leisten (die Kosten für eine globale Suche zu bezahlen iter).
Martijn Pieters