Pregunta Verifique si una clave dada ya existe en un diccionario


Quería probar si existe una clave en un diccionario antes de actualizar el valor de la clave. Escribí el siguiente código:

if 'key1' in dict.keys():
  print "blah"
else:
  print "boo"

Creo que esta no es la mejor manera de lograr esta tarea. ¿Hay una mejor manera de probar una clave en el diccionario?


2178
2017-10-21 19:05


origen


Respuestas:


in es la forma prevista de probar la existencia de una clave en un dict.

d = dict()

for i in xrange(100):
    key = i % 10
    if key in d:
        d[key] += 1
    else:
        d[key] = 1

Si quería un valor predeterminado, siempre puede usar dict.get():

d = dict()

for i in xrange(100):
    key = i % 10
    d[key] = d.get(key, 0) + 1

... y si siempre desea garantizar un valor predeterminado para cualquier tecla que pueda usar defaultdict desde el collections módulo, como ese:

from collections import defaultdict

d = defaultdict(lambda: 0)

for i in xrange(100):
    d[i % 10] += 1

... pero, en general, el in la palabra clave es la mejor manera de hacerlo.


2232
2017-10-21 19:10



No tienes que llamar a las teclas:

if 'key1' in dict:
  print "blah"
else:
  print "boo"

Eso será mucho Más rápido como utiliza el hashing del diccionario en lugar de hacer una búsqueda lineal, qué teclas de llamada harían.


1093
2017-10-21 19:06



Puede probar la presencia de una clave en un diccionario, utilizando en palabra clave:

d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False

Un uso común para verificar la existencia de una clave en un diccionario antes de mutarlo es inicializar el valor por defecto (por ejemplo, si sus valores son listas, por ejemplo, y quiere asegurarse de que haya una lista vacía a la que pueda agregar al insertar el primer valor para una tecla). En casos como esos, puede encontrar el collections.defaultdict() tipo para ser de interés.

En un código anterior, también puede encontrar algunos usos de has_key(), un método obsoleto para verificar la existencia de claves en los diccionarios (solo use key_name in dict_name, en cambio).


226
2017-10-21 19:16



Puedes acortar esto:

if 'key1' in dict:
    ...

Sin embargo, esto es, en el mejor de los casos, una mejora cosmética. ¿Por qué crees que esta no es la mejor manera?


74
2017-10-21 19:06



Yo recomendaría usar el setdefault método en su lugar. Parece que hará todo lo que quieras.

>>> d = {'foo':'bar'}
>>> q = d.setdefault('foo','baz') #Do not override the existing key
>>> print q #The value takes what was originally in the dictionary
bar
>>> print d
{'foo': 'bar'}
>>> r = d.setdefault('baz',18) #baz was never in the dictionary
>>> print r #Now r has the value supplied above
18
>>> print d #The dictionary's been updated
{'foo': 'bar', 'baz': 18}

40
2017-10-21 19:07



Para obtener información adicional sobre la velocidad de ejecución de los métodos propuestos de la respuesta aceptada (bucles de 10 m):

  • 'key' in mydict tiempo transcurrido 1.07 segundos
  • mydict.get('key') tiempo transcurrido 1.84 segundos
  • mydefaultdict['key'] tiempo transcurrido 1.07 segundos

Por lo tanto usando in o defaultdict se recomiendan contra get.


35
2018-05-29 11:06



El diccionario en python tiene un método get ('clave', predeterminado). Entonces puede establecer un valor predeterminado en caso de que no haya una clave.

values = {...}
myValue = values.get('Key', None)

19
2018-03-01 09:03



Para verificar, puede usar has_key() método

if dict.has_key('key1'):
   print "it is there"

Si quieres un valor, entonces puedes usar get() método

a = dict.get('key1', expeced_type)

Si desea una tupla o lista o diccionario o cualquier cadena como valor predeterminado como valor de retorno, utilice get() método

a = dict.get('key1', {}).get('key2', [])

15
2017-09-10 18:37



Usando operador ternario:

message = "blah" if 'key1' in dict else "booh"
print(message)

14
2017-08-18 22:58



¿Qué pasa con el uso de EAFP (más fácil pedir perdón que permiso):

try:
   blah = dict["mykey"]
   # key exists in dict
except KeyError:
   # key doesn't exist in dict

Ver otras publicaciones de SO:

Usando try vs si en python o

Comprobando la existencia del miembro en Python


14
2018-02-06 16:08



Solo un FYI añadiendo a Chris. B (la mejor respuesta):

d = defaultdict(int)

Funciona también la razón es que llamar int() devoluciones 0 Que es que defaultdict lo hace detrás de escena (cuando se construye un diccionario), de ahí el nombre "Función de fábrica" ​​en la documentación.


13
2018-05-19 18:12