valor - recorrer diccionario python




Compruebe si una clave dada ya existe en un diccionario (13)

¿Por qué no usar el método has_key ()?

a = {}
a.has_key('b') => #False

a['b'] = 8
a.has_key('b') => #True

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?



El diccionario de Python tiene el método llamado __contains__ . Este método devolverá True si el diccionario tiene la clave; de ​​lo contrario, devolverá False.

 >>> temp = {}

 >>> help(temp.__contains__)

Help on built-in function __contains__:

__contains__(key, /) method of builtins.dict instance
    True if D has a key k, else False.

El diccionario en python tiene un método de obtención ('clave', predeterminado). Así que solo puede establecer un valor predeterminado en caso de que no haya una clave.

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

No tienes que llamar teclas:

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

Eso será mucho faster ya que utiliza el hash del diccionario en lugar de hacer una búsqueda lineal, lo que harían las teclas de llamada.


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

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

Por lo tanto, se recomienda usar in o defaultdict contra get .


Puede 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 verificar la existencia de una clave en un diccionario antes de mutarlo es inicializar por defecto el valor (por ejemplo, si sus valores son listas, por ejemplo, y desea asegurarse de que haya una lista vacía a la que pueda agregar) al insertar el primer valor para una clave). En casos como estos, puede encontrar que el tipo collections.defaultdict() es de interés.

En el 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 ).


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?


Sólo un FYI añadiendo a Chris. B (mejor respuesta):

d = defaultdict(int)

Funciona también; La razón es que llamar a int() devuelve 0 que es lo que hace el valor defaultdict detrás de escena (al construir un diccionario), de ahí el nombre "Función de fábrica" ​​en la documentación.


Utilizando operador ternario:

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

in es la forma prevista para 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 desea 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 desea garantizar siempre un valor predeterminado para cualquier clave, puede usar defaultdict desde el módulo de collections , así:

from collections import defaultdict

d = defaultdict(lambda: 0)

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

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


print dict.get('key1', 'blah')

No imprimirá abucheos para los valores en el dict, pero logra el objetivo imprimiendo el valor de key1 para confirmar su existencia.


Puedes usar el método has_key ():

if dict.has_key('xyz')==1:
    #update the value for the key
else:
    pass

O el método dict.get para establecer un valor predeterminado si no se encuentra:

mydict = {"a": 5}

print mydict["a"]            #prints 5
print mydict["b"]            #Throws KeyError: 'b'

print mydict.get("a", 0)     #prints 5
print mydict.get("b", 0)     #prints 0






dictionary