runtimeerror remove last from during delete changed array python dictionary unset

last - remove list element python 3



¿Cómo eliminar una clave de un diccionario de Python? (8)

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.

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?


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

pop (tecla [, por defecto])

Si la clave está en el diccionario, elimínela y devuelva su valor; de lo contrario, devuelva el valor predeterminado. Si no se proporciona el valor predeterminado y la clave no está en el diccionario, se genera un error KeyError

Documentation


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

Usando la palabra clave del ; Es casi el mismo enfoque que hiciste, sin embargo ...

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 hay que tener en cuenta que, en este proceso, en realidad no eliminará ninguna clave del diccionario en lugar de excluir una clave específica de ese diccionario. Además, observé que devolvía un diccionario que no estaba ordenado como 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 como {''five'': 500, ''four'': 400, ''three'': 300, ''two'': 200} - note que no es lo mismo que myDict . Nuevamente, si intentamos imprimir myDict , podemos ver todas las claves, incluidas las que excluimos del diccionario con 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, seguiremos el orden principal:

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

O

Utilizando el método pop() .

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 que, utilizando pop() método pop() , podemos almacenar el valor de la clave si es necesario, como lo 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


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

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 en los que saca un valor que no está en el diccionario, use lambda en el mapa () 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, a pesar de que myDict no tenía una clave ''e''.


Tiempo de las tres soluciones descritas anteriormente.

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


Usando la palabra clave "del":

del dict[key]


Utilice dict.pop() :

my_dict.pop(''key'', None)

Esto devolverá my_dict[key] si la key existe en el diccionario, y None caso contrario. Si no se especifica el segundo parámetro (es decir, my_dict.pop(''key'') ) y la key no existe, se KeyError un KeyError .


Utilizar:

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

De otra manera:

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

Se puede eliminar por condiciones. No hay error si la key no existe.