Cómo verificar si existe un valor en un diccionario (python)

251

Tengo el siguiente diccionario en python:

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

Necesito una manera de encontrar si existe un valor como "uno" o "dos" en este diccionario.

Por ejemplo, si quisiera saber si el índice "1" existía, simplemente tendría que escribir:

"1" in d

Y luego Python me diría si eso es verdadero o falso, sin embargo, necesito hacer exactamente lo mismo, excepto para encontrar si existe un valor.

JimmyK
fuente

Respuestas:

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

Por curiosidad, algunos tiempos comparativos:

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

EDITAR: Y en caso de que se pregunte por qué ... la razón es que cada uno de los anteriores devuelve un tipo diferente de objeto, que puede o no ser adecuado para operaciones de búsqueda:

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

EDIT2: Según la solicitud en los comentarios ...

>>> 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]
Mac
fuente
No tengo Python a mano, ¿podría volver a ejecutar las pruebas con 'cuatro' en lugar de 'uno'?
soulcheck
2
después de todo, no era necesario, a menos que se ejecutara en un dict más grande. Supongo que la sobrecarga en los valores () se produce al copiar la lista de valores y en viewvalues ​​() al mantener la vista viva.
soulcheck
Dado el pequeño tamaño de d, los tiempos carecen de sentido. En Python 3, dict.values()es una vista de diccionario, por defecto, y dict.itervalues()ya no dict.viewvalues()están. Puede volver a probar esto (con un diccionario más grande) y usar list(d.values())para obtener el comportamiento de Python 2, y iter(d.values())para obtener el dict.itervalues()comportamiento, pero debido a que ambas versiones requieren una búsqueda y llamada global, serán absolutamente más lentas. Ambos hacen un trabajo extra que no es necesario.
Martijn Pieters
33

Puedes usar

"one" in d.itervalues()

para probar si "one"está entre los valores de tu diccionario.

Sven Marnach
fuente
22

Diccionario de Python tiene get (clave) del funcion

>>> d.get(key)

Por ejemplo,

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

Si su clave no existe, devolverá el nonevalor.

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

Contenido relevante para versiones inferiores a 3.0 y superiores a 5.0. .

Shameem
fuente
29
No responde la pregunta. OP preguntó sobre un valor como en key:valuey no clave.
akshaynagpal
10

Usar vistas de diccionario:

if x in d.viewvalues():
    dosomething()..
verificación del alma
fuente
4

Existen diferentes tipos para verificar los valores

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

¿Qué pasa si la lista de valores

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

¿Qué pasa si la lista de valores con valores de cadena

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
fuente
No use value in [... list comprehension over sequence ...], use any(value in sequence ...), para evitar crear un objeto de lista que no use para otra cosa, y hacer un cortocircuito cuando se encuentre el valor.
Martijn Pieters
0

En Python 3 puedes usar la values()función del diccionario. Devuelve un objeto de vista de los valores. Esto, a su vez, se puede pasar a la iterfunción que devuelve un objeto iterador. El iterador se puede verificar usando in, de esta manera,

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

O puede usar el objeto de vista directamente ya que es similar a una lista

'one' in d.values()
Reed Richards
fuente
1
No tiene sentido usar iter()en una vista de diccionario;inya usará el objeto como iterable (el tipo no implementa un __contains__método dedicado ). La única diferencia entre 'one' in iter(d.values())y 'one in d.values()es que hizo que Python hiciera un trabajo extra (pagando el costo de una búsqueda global iter).
Martijn Pieters