python agregar - Compruebe si una clave dada ya existe en un diccionario




elementos lista (17)

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.

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?


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?


Yo uso el try / except ; si se lanza una excepción, entonces la clave no está presente en el diccionario. ejemplo:

st = 'sdhfjaks'
d = {}
try:
    print d['st']
except Exception, e:
    print 'Key not in the dictionary'

Las formas en que puede obtener los resultados son:

Lo que es mejor depende de 3 cosas:

  1. ¿El diccionario 'normalmente tiene la clave' o 'normalmente no tiene la clave'?
  2. ¿Tiene la intención de utilizar condiciones como si ... más ... elseif ... más?
  3. ¿Qué tan grande es el diccionario?

Leer más: http://paltman.com/try-except-performance-in-python-a-simple-test/

Uso de try / block en lugar de 'in' o 'if':

try:
    my_dict_of_items[key_i_want_to_check]
except KeyError:
    # Do the operation you wanted to do for "key not present in dict".
else:
    # Do the operation you wanted to do with "key present in dict."

La más sencilla es si sabe qué clave (nombre de clave) debe buscar:

# suppose your dictionary is
my_dict = {'foo': 1, 'bar': 2}
# check if a key is there
if 'key' in my_dict.keys():   # it will evaluates to true if that key is present otherwise false.
    # do something

o también puedes hacerlo simplemente como:

if 'key' in my_dict:   # it will evaluates to true if that key is present otherwise false.
    # do something


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


Utilizando operador ternario:

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

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

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.

Bien ... Estará familiarizado con que buscar la existencia de un elemento en una lista o datos significa revisar todo (al menos para listas desordenadas, por ejemplo, dict.keys). Por lo tanto, al usar Excepción y Errores que surgen normalmente, podemos evitar esa complejidad ...

d={1:'a',2:'b'}
try:
    needed=d[3]
    print(needed)
except:
    print("Key doesnt exist")

Recomendaría usar el método setdefault lugar. Parece que va a hacer 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}

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 .


Para verificar puedes usar el método has_key()

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

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

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

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

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

Específicamente para responder "¿hay una forma de una línea de hacer esto?"

if 'key' in myDict: del myDict['key']

... bueno, tu preguntaste ;-)

Sin embargo, debe considerar que esta forma de eliminar un objeto de un dict no es atómica ; es posible que 'key' esté en myDict durante la instrucción if , pero puede eliminarse antes de que se ejecute del, en cuyo caso del will falla con un KeyError . Dado esto, sería más seguro utilizar dict.pop o algo dict.pop

try:
    del myDict['key']
except KeyError:
    pass

que, por supuesto, definitivamente no es de una sola línea.





python dictionary