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

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]

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.


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


29
Nie odpowiada na pytanie. OP zapytał o wartość jak w, key:valuea nie klucz.
akshaynagpal


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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.