Jak sprawdzić, czy wartość istnieje w słowniku (python)

251

W języku python mam następujący słownik:

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

Potrzebuję sposobu, aby sprawdzić, czy wartość taka jak „jeden” lub „dwa” istnieje w tym słowniku.

Na przykład, jeśli chciałbym wiedzieć, czy istnieje indeks „1”, musiałbym po prostu wpisać:

"1" in d

A potem python powiedziałby mi, czy to prawda, czy fałsz, jednak muszę zrobić to samo dokładnie, z wyjątkiem sprawdzenia, czy istnieje wartość.

JimmyK
źródło

Odpowiedzi:

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

Z ciekawości trochę porównawczych terminów:

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

EDYCJA: A jeśli zastanawiasz się, dlaczego ... powodem jest to, że każdy z powyższych zwraca inny typ obiektu, który może, ale nie musi, być odpowiedni dla operacji wyszukiwania:

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

EDYCJA 2: Zgodnie z żądaniem w komentarzach ...

>>> 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]
prochowiec
źródło
nie mam pod ręką pytona, czy możesz powtórzyć testy z „czterema” zamiast „jednym”?
soulcheck
2
w końcu nie było to konieczne, chyba że prowadzono by większy dyktand. Wydaje mi się, że narzut w wartościach () jest spowodowany kopiowaniem listy wartości oraz w viewvalues ​​() przez utrzymanie widoku przy życiu.
soulcheck 21.11.11
Biorąc pod uwagę niewielki rozmiar d, czasy są praktycznie bez znaczenia. W Pythonie 3 dict.values()jest domyślnie widokiem słownika dict.itervalues()i dict.viewvalues()już go nie ma. Możesz to przetestować ponownie (z większym słownikiem) i użyć, list(d.values())aby uzyskać zachowanie Python 2 i iter(d.values())uzyskać takie dict.itervalues()zachowanie, ale ponieważ obie wersje wymagają globalnego wyszukiwania i wywoływania, będą one absolutnie wolniejsze. Obaj wykonują dodatkową pracę, która nie jest potrzebna.
Martijn Pieters
33

Możesz użyć

"one" in d.itervalues()

aby sprawdzić, czy "one"należy do wartości Twojego słownika.

Sven Marnach
źródło
23

Słownik Pythona ma funkcję (klucz)

>>> d.get(key)

Na przykład,

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

Jeśli twój klucz nie istnieje, zwróci nonewartość.

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

Treść odpowiednia dla wersji mniejszych niż 3.0 i większych niż 5.0. .

Shameem
źródło
29
Nie odpowiada na pytanie. OP zapytał o wartość jak w, key:valuea nie klucz.
akshaynagpal
10

Użyj widoków słownika:

if x in d.viewvalues():
    dosomething()..
soulcheck
źródło
4

Istnieją różne typy sprawdzania wartości

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

Co jeśli lista wartości

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

Co jeśli lista wartości z wartościami ciągu

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
źródło
Nie używaj value in [... list comprehension over sequence ...], używaj any(value in sequence ...), aby uniknąć utworzenia obiektu listy, którego nie użyjesz do niczego innego, i do zwierania, gdy wartość zostanie znaleziona.
Martijn Pieters
0

W Pythonie 3 możesz użyć values()funkcji słownika. Zwraca obiekt widoku wartości. To z kolei może zostać przekazane do iterfunkcji, która zwraca obiekt iteratora. Iterator można sprawdzić za pomocą in, jak to,

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

Lub możesz użyć obiektu widoku bezpośrednio, ponieważ jest on podobny do listy

'one' in d.values()
Reed Richards
źródło
1
Nie ma sensu w korzystaniu iter()w słowniku widzenia; inużyje już obiektu jako iterowalnego (typ nie implementuje dedykowanej __contains__metody). Jedyna różnica między 'one' in iter(d.values())i 'one in d.values()polega na tym, że Python wykonał dodatkową pracę (ponosząc koszty globalnego wyszukiwania iter).
Martijn Pieters