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