¿Cómo comprobar si existe un valor en un diccionario?

Resuelto JimmyK asked hace 13 años • 7 respuestas

Tengo el siguiente diccionario en Python:

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

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

Por ejemplo, si quisiera saber si existe el índice "1" 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 avatar Nov 21 '11 23:11 JimmyK
Aceptado
>>> d = {'1': 'one', '3': 'three', '2': 'two', '5': 'five', '4': 'four'}
>>> 'one' in d.values()
True

Por curiosidad, algo de tiempo comparativo:

>>> 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 avatar Nov 21 '2011 16:11 mac

En Python 3, puedes usar

"one" in d.values()

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

En Python 2, es más eficiente usar

"one" in d.itervalues()

en cambio.

Tenga en cuenta que esto desencadena una exploración lineal a través de los valores del diccionario, provocando un cortocircuito tan pronto como se encuentra, por lo que esto es mucho menos eficiente que verificar si hay una clave presente.

Sven Marnach avatar Nov 21 '2011 16:11 Sven Marnach

El diccionario Python tiene la función get(key)

>>> 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á Noneun valor.

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 avatar Nov 22 '2016 04:11 Shameem

Utilice vistas de diccionario:

if x in d.viewvalues():
    dosomething()..
soulcheck avatar Nov 21 '2011 16:11 soulcheck

Existen diferentes tipos para comprobar 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
 avatar Aug 06 '2019 04:08