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.

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]

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.


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


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()..

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

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()

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.