Pregunta ¿Cómo eliminar una clave de un diccionario de Python?


Cuando intento eliminar una clave de un diccionario, escribo:

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

¿Hay una forma de una línea de hacer esto?


1048
2018-06-30 20:27


origen


Respuestas:


Utilizar dict.pop():

my_dict.pop('key', None)

Esto regresará my_dict[key] Si key existe en el diccionario, y None de otra manera. Si el segundo parámetro no está especificado (es decir. my_dict.pop('key')) y key no existe, una KeyError es elevado.


1744
2018-06-30 20:29



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

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

... bueno, tú preguntó ;-)

Sin embargo, debe considerar que esta forma de eliminar un objeto de una dict es no atómico-es posible que 'key' tal vez en myDict durante el if declaración, pero puede ser eliminada antes del se ejecuta, en cuyo caso del fallará con un KeyError. Dado esto, sería más seguro para cualquiera utilizar dict.pop o algo parecido a

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

que, por supuesto, es definitivamente no un trazador de líneas.


260
2018-06-30 20:36



Me tomó algo de tiempo averiguar qué es exactamente my_dict.pop("key", None) está haciendo. Así que voy a agregar esto como una respuesta para ahorrarle tiempo a otros Google:

pop (clave [, predeterminado])

Si la clave está en el diccionario, quítela y devuelva su valor, de lo contrario   retorno predeterminado. Si no se proporciona el valor predeterminado y la clave no está en el   diccionario, se genera un KeyError

Documentación


115
2018-03-04 16:43



Momento de las tres soluciones descritas arriba.

Pequeño diccionario:

>>> import timeit
>>> timeit.timeit("d={'a':1}; d.pop('a')")
0.23399464370632472
>>> timeit.timeit("d={'a':1}; del d['a']")
0.15225347193388927
>>> timeit.timeit("d={'a':1}; d2 = {key: val for key, val in d.items() if key != 'a'}")
0.5365207354998063

Diccionario más grande:

>>> timeit.timeit("d={nr: nr for nr in range(100)}; d.pop(3)")
5.478138627299643
>>> timeit.timeit("d={nr: nr for nr in range(100)}; del d[3]")
5.362219126590048
>>> timeit.timeit("d={nr: nr for nr in range(100)}; d2 = {key: val for key, val in d.items() if key != 3}")
13.93129749387532

25
2017-12-07 12:19



Si necesita eliminar muchas claves de un diccionario en una línea de código, creo que usar map () es bastante breve y legible en Pythonic:

myDict = {'a':1,'b':2,'c':3,'d':4}
map(myDict.pop, ['a','c']) # The list of keys to remove
>>> myDict
{'b': 2, 'd': 4}

Y si necesita detectar errores donde extrae un valor que no está en el diccionario, use lambda dentro de map () de esta manera:

map(lambda x: myDict.pop(x,None), ['a','c','e'])
[1, 3, None] # pop returns
>>> myDict
{'b': 2, 'd': 4}

Funciona. Y 'e' no causó un error, aunque myDict no tenía la tecla 'e'.


20
2017-09-16 19:17



Utilizar:

>>> if myDict.get(key): myDict.pop(key)

De otra manera:

>>> {k:v for k, v in myDict.items() if k != 'key'}

Puede eliminar por condiciones. Sin error si key no existe


14
2017-12-07 05:52



Usando la palabra clave "del":

del dict[key]

5
2018-05-02 10:22



Podemos eliminar una clave de un diccionario de Python mediante los siguientes enfoques.

Utilizando el del palabra clave; es casi el mismo enfoque como tú lo hiciste,

 myDict = {'one': 100, 'two': 200, 'three': 300 }
 print(myDict)  # {'one': 100, 'two': 200, 'three': 300}
 if myDict.get('one') : del myDict['one']
 print(myDict)  # {'two': 200, 'three': 300}

O

Podemos hacer lo siguiente:

Pero uno debe tener en cuenta que, en este proceso en realidad no lo hará borrar cualquier tecla del diccionario en lugar de hacer una clave específica excluido de ese diccionario Además, observé que devolvía un diccionario que no estaba ordenado de la misma manera que myDict.

myDict = {'one': 100, 'two': 200, 'three': 300, 'four': 400, 'five': 500}
{key:value for key, value in myDict.items() if key != 'one'}

Si lo ejecutamos en el shell, ejecutará algo así como {'five': 500, 'four': 400, 'three': 300, 'two': 200} - fíjate que no es el mismo orden que myDict. De nuevo si tratamos de imprimir myDict, entonces podemos ver todas las claves, incluidas las que excluimos del diccionario mediante este enfoque. Sin embargo, podemos crear un nuevo diccionario asignando la siguiente declaración a una variable:

var = {key:value for key, value in myDict.items() if key != 'one'}

Ahora, si intentamos imprimirlo, seguirá el orden principal:

print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}

O

Utilizando el pop() método.

myDict = {'one': 100, 'two': 200, 'three': 300}
print(myDict)

if myDict.get('one') : myDict.pop('one')
print(myDict)  # {'two': 200, 'three': 300}

La diferencia entre del y pop es eso, usando pop()método, podemos almacenar el valor de la clave si es necesario, como el siguiente:

myDict = {'one': 100, 'two': 200, 'three': 300}
if myDict.get('one') : var = myDict.pop('one')
print(myDict) # {'two': 200, 'three': 300}
print(var)    # 100

3
2018-05-19 10:09