¿Cómo comprobar si existe un valor en un diccionario?
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.
>>> 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]
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.
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á None
un 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.
Utilice vistas de diccionario:
if x in d.viewvalues():
dosomething()..
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