Comprobar si una clave determinada 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 realizar esta tarea. ¿Existe una mejor manera de probar una clave en el diccionario?
in
pruebas para la existencia de una clave en a dict
:
d = {"key1": 10, "key2": 23}
if "key1" in d:
print("this will execute")
if "nonexistent key" in d:
print("this will not")
Úselo dict.get()
para proporcionar un valor predeterminado cuando la clave no existe:
d = {}
for i in range(100):
key = i % 10
d[key] = d.get(key, 0) + 1
Para proporcionar un valor predeterminado para cada clave, utilice dict.setdefault()
en cada asignación:
d = {}
for i in range(100):
d[i % 10] = d.setdefault(i % 10, 0) + 1
...o mejor, usa defaultdict
desde el collections
módulo:
from collections import defaultdict
d = defaultdict(int)
for i in range(100):
d[i % 10] += 1
Úselo key in my_dict
directamente en lugar de key in my_dict.keys()
:
if 'key1' in my_dict:
print("blah")
else:
print("boo")
Eso será mucho más rápido ya que utiliza el hash O(1) del diccionario en lugar de realizar una búsqueda lineal O(n) en una lista de claves.
Puedes probar la presencia de una clave en un diccionario, usando la palabra clave in :
d = {'a': 1, 'b': 2}
'a' in d # <== evaluates to True
'c' in d # <== evaluates to False
Un uso común para comprobar la existencia de una clave en un diccionario antes de mutarla es inicializar el valor de forma predeterminada (por ejemplo, si sus valores son listas y desea asegurarse de que haya una lista vacía a la que pueda agregar al insertar el primer valor de una clave). En casos como esos, es posible que encuentre el collections.defaultdict()
tipo que le interese.
En código antiguo, también puedes encontrar algunos usos de has_key()
, un método obsoleto para verificar la existencia de claves en diccionarios (solo usa key_name in dict_name
, en su lugar).
Puedes acortar tu código a esto:
if 'key1' in my_dict:
...
Sin embargo, esto es, en el mejor de los casos, una mejora cosmética. ¿Por qué cree que esta no es la mejor manera?