352 Stimmen

Wie kann man prüfen, ob ein Wert in einem Wörterbuch vorhanden ist?

Ich habe das folgende Wörterbuch in Python:

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

Ich brauche eine Möglichkeit, um herauszufinden, ob ein Wert wie "eins" oder "zwei" in diesem Wörterbuch existiert.

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

"1" in d

Und dann Python würde mir sagen, wenn das wahr oder falsch ist, aber ich muss genau das gleiche tun, außer zu finden, wenn ein Wert vorhanden ist.

492voto

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

Aus reiner Neugierde ein paar Zeitvergleiche:

>>> 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 dafür ist, dass jede der oben genannten Methoden einen anderen Objekttyp zurückgibt, der für Nachschlageoperationen gut geeignet sein kann oder auch nicht:

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

EDIT2: Wie in den Kommentaren gewünscht...

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

52voto

Sven Marnach Punkte 525472

In Python 3 können Sie

"one" in d.values()

um zu prüfen, ob "one" zu den Werten Ihres Wörterbuchs gehört.

In Python 2 ist es effizienter, die Funktion

"one" in d.itervalues()

stattdessen.

Beachten Sie, dass dies einen linearen Scan durch die Werte des Wörterbuchs auslöst und einen Kurzschluss auslöst, sobald der Schlüssel gefunden wird, so dass dies viel weniger effizient ist als die Überprüfung, ob ein Schlüssel vorhanden ist.

33voto

Shameem Punkte 2324

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

>>> d.get(key)

Zum Beispiel,

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

Existiert Ihr Schlüssel nicht, dann wird zurückgegeben None Wert.

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

Inhalte, die für Versionen kleiner als 3.0 und größer als 5.0 relevant sind.

11voto

soulcheck Punkte 35658

Verwenden Sie Wörterbuchansichten:

if x in d.viewvalues():
    dosomething()..

5voto

Verschiedene Typen zur Überprüfung der Werte vorhanden

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

Was wäre, wenn die 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 Zeichenkettenwerten

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X