Come verificare se esiste un valore in un dizionario (python)


251

Ho il seguente dizionario in Python:

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

Ho bisogno di un modo per scoprire se in questo dizionario esiste un valore come "uno" o "due".

Ad esempio, se volessi sapere se esistesse l'indice "1", dovrei semplicemente digitare:

"1" in d

E poi Python mi direbbe se è vero o falso, tuttavia devo fare la stessa cosa esatta, tranne per scoprire se esiste un valore.

Risposte:


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

Per curiosità, alcuni tempi comparativi:

>>> 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: E nel caso ti chiedi perché ... il motivo è che ognuna di queste restituisce un diverso tipo di oggetto, che può o meno essere adatto per le operazioni di ricerca:

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

EDIT2: come da richiesta nei commenti ...

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

non ho pitone a portata di mano, potresti ripetere i test con "quattro" anziché "uno"?
soulcheck,

2
dopotutto non era necessario, a meno che non fosse eseguito su un dict più grande. Immagino che il sovraccarico nei valori () sia causato copiando l'elenco dei valori e in viewvalues ​​() mantenendo attiva la vista.
soulcheck,

Date le dimensioni ridotte di d, i tempi sono effettivamente insignificanti. In Python 3, dict.values()è una vista del dizionario, per impostazione predefinita, dict.itervalues()e non ci dict.viewvalues()sono più. Potresti testarlo nuovamente (con un dizionario più grande) e usarlo list(d.values())per ottenere il comportamento di Python 2 e iter(d.values())per ottenere il dict.itervalues()comportamento, ma poiché entrambe le versioni richiedono una ricerca e una chiamata globali, saranno assolutamente più lente. Entrambi fanno un lavoro extra che non è necessario.
Martijn Pieters

33

Puoi usare

"one" in d.itervalues()

per verificare se "one"è tra i valori del tuo dizionario.


22

Dizionario Python ha get (chiave) funcion

>>> d.get(key)

Per esempio,

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

Se la chiave non esiste, verrà restituito un nonevalore.

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

Contenuti pertinenti alle versioni inferiori a 3.0 e successive a 5.0. .


29
Non risponde alla domanda OP ha chiesto un valore come in key:valuee non la chiave.
akshaynagpal,

10

Utilizza le viste del dizionario:

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

4

Esistono diversi tipi per verificare i valori

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

Cosa succede se elenco di valori

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

Cosa succede se elenco di valori con valori stringa

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

Non utilizzare value in [... list comprehension over sequence ...], utilizzare any(value in sequence ...)per evitare la creazione di un oggetto elenco che non si utilizza per nient'altro e per cortocircuitare quando viene trovato il valore.
Martijn Pieters

0

In Python 3 puoi usare la values()funzione del dizionario. Restituisce un oggetto vista dei valori. Questo, a sua volta, può essere passato alla iterfunzione che restituisce un oggetto iteratore. L'iteratore può essere verificato usando in, in questo modo,

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

Oppure puoi usare direttamente l'oggetto vista poiché è simile a un elenco

'one' in d.values()

1
Non ha senso utilizzare iter()una vista dizionario; inutilizzerà già l'oggetto come iterabile (il tipo non implementa un __contains__metodo dedicato ). L'unica differenza tra 'one' in iter(d.values())e 'one in d.values()è che hai fatto fare a Python un lavoro extra (pagando il costo di una ricerca globale iter).
Martijn Pieters
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.