Cum să verificați dacă o valoare există într-un dicționar (python) (Programare, Python, Dicționar, Găsiți)

JimmyK a intrebat.

Am următorul dicționar în python:

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

Am nevoie de o modalitate de a afla dacă o valoare, cum ar fi „unu” sau „doi”, există în acest dicționar.

De exemplu, dacă aș vrea să știu dacă există indicele „1” ar trebui pur și simplu să tastez:

"1" in d

Și apoi python mi-ar spune dacă este adevărat sau fals, însă am nevoie să fac exact același lucru, doar că trebuie să aflu dacă există o valoare.

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

Din curiozitate, niște cronometrare comparativă:

>>> 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: Și în cazul în care vă întrebați de ce… motivul este că fiecare dintre cele de mai sus returnează un tip diferit de obiect, care poate sau nu poate fi bine adaptat pentru operațiunile de căutare:

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

EDIT2: Conform solicitării din comentarii…

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

Comentarii

  • nu am python la îndemână, ați putea relua testele cu „patru” în loc de „unu” ? –  > Por soulcheck.
  • până la urmă nu era necesar, dacă nu se executa pe dict mai mare. Presupun că overhead-ul din values() este cauzat de copierea listei de valori, iar în viewvalues() de menținerea în viață a vizualizării. –  > Por soulcheck.
  • Având în vedere dimensiunea mică a d, , timpii sunt efectiv lipsiți de sens. În Python 3, dict.values() este o vizualizare de dicționar, în mod implicit, iar dict.itervalues() și dict.viewvalues() au dispărut. Ați putea testa din nou acest lucru (cu un dicționar mai mare) și să utilizați list(d.values()) pentru a obține comportamentul din Python 2, iar iter(d.values()) pentru a obține comportamentul dict.itervalues() dar, deoarece ambele versiuni necesită o căutare și un apel global, vor fi mai lente. Ambele fac o muncă suplimentară care nu este necesară. –  > Por Martijn Pieters.
Sven Marnach

În Python 3, puteți utiliza

"one" in d.values()

pentru a testa dacă "one" se află printre valorile dicționarului dumneavoastră.

În Python 2, este mai eficient să folosiți

"one" in d.itervalues()

în schimb.

Rețineți că acest lucru declanșează o scanare liniară prin valorile dicționarului, scurtcircuitând imediat ce este găsit, deci este mult mai puțin eficient decât verificarea prezenței unei chei.

Comentarii

  • Știu că aceasta este o într-adevăr vechi, dar am vrut doar să remarc faptul că în Python 3 este values() și nu itervalues(). Am intrat în modul idiot pentru o vreme și am încercat să obțin itervalues() să funcționeze în Python 3, înainte de a-mi da seama că sunt un idiot. –  > Por digitalformula.
  • @digitalformula Mulțumesc, am actualizat răspunsul pentru a fi mai util. –  > Por Sven Marnach.
  • @digitalformula Exact asta a fost capcana în care am intrat și eu, mulțumesc foarte mult – -.  > Por procra.
Shameem

Dicționarul Python are get(key) funcția

>>> d.get(key)

De exemplu,

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

Dacă cheia nu există, va returna None valoarea.

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

Conținutul este relevant pentru versiunile mai mici de 3.0 și mai mari de 5.0.

.

Comentarii

    39

  • Nu răspunde la întrebare. OP a întrebat despre o valoare ca în key:value și nu cheie. –  > Por akshaynagpal.
soulcheck

Utilizați vizualizări de dicționar:

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

user1464878

Diferite tipuri pentru a verifica valorile există

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

Ce se întâmplă dacă lista de valori

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

Ce se întâmplă dacă lista de valori cu valori de tip șir de caractere

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

Comentarii

  • Nu se utilizează value in [... list comprehension over sequence ...], , folosiți any(value in sequence ...), , pentru a evita crearea unui obiect listă pe care nu îl folosiți pentru nimic altceva și pentru a face un scurtcircuit atunci când valoarea a fost găsită. –  > Por Martijn Pieters.
Reed Richards

În Python 3 puteți utiliza opțiunea values() a dicționarului. Aceasta returnează un obiect de vizualizare a valorilor. Acesta, la rândul său, poate fi trecut la funcția iter care returnează un obiect iterator. Iteratorul poate fi verificat cu ajutorul funcției in, , astfel,

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

Sau puteți utiliza direct obiectul de vizualizare, deoarece este similar cu o listă

'one' in d.values()

Comentarii

  • Există nici un sens în a utiliza iter() pe o vizualizare de tip dicționar; in va utiliza deja obiectul ca iterabil (tipul nu implementează un obiect dedicat __contains__ dedicată). Singura diferență între 'one' in iter(d.values()) și 'one in d.values() este că l-ați făcut pe Python să facă o muncă suplimentară (plătind costul unei căutări globale pentru iter). –  > Por Martijn Pieters.