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.

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]

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.


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


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


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

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.