Al eliminar una clave de un diccionario, uso:
if 'key' in my_dict:
del my_dict['key']
¿Hay una forma de hacer esto en una sola línea?
Al eliminar una clave de un diccionario, uso:
if 'key' in my_dict:
del my_dict['key']
¿Hay una forma de hacer esto en una sola línea?
Respuestas:
Para eliminar una clave independientemente de si está en el diccionario, use la forma de dos argumentos de
dict.pop()
:Esto regresará
my_dict[key]
sikey
existe en el diccionario, y de loNone
contrario. Si el segundo parámetro no se especifica (es decirmy_dict.pop('key')
) ykey
no existe,KeyError
se genera a.Para eliminar una clave que se garantiza que existe, también puede usar
Esto elevará un
KeyError
si la clave no está en el diccionario.fuente
pop()
overdel
: devuelve el valor de esa clave. De esta manera, puede obtener y eliminar una entrada de un dict en una línea de código.try
/except
si la clave no existe. Es posible que encuentre uno u otro más fácil de leer, lo cual está bien. Ambos son Python idiomáticos, así que elige lo que prefieras. Pero afirmar que esta respuesta es más compleja o ineficiente simplemente no tiene sentido.self
, por lo que sería bastante sorprendente si este lo hiciera.Específicamente para responder "¿hay una forma de hacer esto en una línea?"
... bueno, preguntaste ;-)
Sin embargo, debe tener en cuenta que esta forma de eliminar un objeto de a no
dict
es atómica: es posible que'key'
se encuentremy_dict
durante laif
instrucción, pero que se elimine antes dedel
ejecutarse, en cuyo casodel
fallará con aKeyError
. Dado esto, sería más seguro usardict.pop
o algo similar a las líneas deque, por supuesto, definitivamente no es una frase.
fuente
pop
es definitivamente más conciso, aunque hay una ventaja clave de hacerlo de esta manera: está claro de inmediato lo que está haciendo.try/except
declaración es más cara. Elevar una excepción es lento.try
es marginalmente más rápida, aunque si no es así,try
es mucho más lenta.pop
es bastante consistente pero más lento que todos perotry
con una clave no presente. Ver gist.github.com/zigg/6280653 . En última instancia, depende de la frecuencia con la que espere que la clave esté realmente en el diccionario y de si necesita o no atomicidad, y, por supuesto, de si está participando o no en una optimización prematura;)if 'key' in mydict: #then del...
. Necesitaba sacar una clave / val de un dict para analizar correctamente, pop no era una solución perfecta.Me tomó un tiempo descubrir qué
my_dict.pop("key", None)
es exactamente lo que está haciendo. Entonces agregaré esto como una respuesta para ahorrar tiempo a otros en Google:Documentación
fuente
dict.pop?
en IPython.del my_dict[key]
es ligeramente más rápido quemy_dict.pop(key)
para eliminar una clave de un diccionario cuando existe la clavePero cuando la clave no existe
if key in my_dict: del my_dict[key]
es un poco más rápido quemy_dict.pop(key, None)
. Ambos son al menos tres veces más rápidos quedel
en una declaracióntry
/except
:fuente
pop
a adel
. La creación del diccionario borrará por completo las cosas borradas de él.del
ypop
desde el primer conjunto de temporizaciones anterior)Si necesita eliminar muchas claves de un diccionario en una línea de código, creo que usar map () es bastante sucinto y legible por Pythonic:
Y si necesita detectar errores donde aparece un valor que no está en el diccionario, use lambda dentro de map () de esta manera:
o en
python3
, debes usar una lista de comprensión en su lugar:Funciona. Y 'e' no causó un error, a pesar de que myDict no tenía una clave 'e'.
fuente
map
amigos ahora son flojos y devuelven iteradores. El usomap
de efectos secundarios generalmente se considera una mala práctica; unfor ... in
bucle estándar sería mejor. Consulte Vistas e iteradores en lugar de listas para obtener más información.[myDict.pop(i, None) for i in ['a', 'c']]
, ya que ofrecen una alternativa general amap
(yfilter
).for ... in
ciclo regular .map()
, que a menudo se usa por sus efectos secundarios. La alternativa recomendada en Python es la comprensión de la lista, que en mi opinión todavía es bastante legible y cognitivamente liviana como una frase (ver pregunta). Utilizados solo por sus efectos secundarios, ambas construcciones resultan en una lista inútil, que puede ser ineficiente. A partir de Python3, no conozco una función incorporada que pueda iterar de manera segura y elegante a través de una expresión de generador, sin un subproducto costoso, por ejemploloop(d.pop(k) for k in ['a', 'b'])
.Puede usar una comprensión del diccionario para crear un nuevo diccionario con esa clave eliminada:
Puedes eliminar por condiciones. No hay error si
key
no existe.fuente
Usando la palabra clave "del":
fuente
Podemos eliminar una clave de un diccionario de Python mediante los siguientes enfoques.
Usando la
del
palabra clave; aunque es casi el mismo enfoque que tú.O
Podemos hacer lo siguiente:
Pero uno debe 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 devolvió un diccionario que no estaba ordenado igual que
myDict
.Si lo ejecutamos en el shell, se ejecutará algo así como
{'five': 500, 'four': 400, 'three': 300, 'two': 200}
: observe que no está ordenado de la misma manera quemyDict
. Nuevamente, si tratamos de imprimirmyDict
, podemos ver todas las claves, incluidas las que excluimos del diccionario mediante este enfoque. Sin embargo, podemos hacer un nuevo diccionario asignando la siguiente declaración en una variable:Ahora, si tratamos de imprimirlo, seguirá el orden principal:
O
Usando el
pop()
método.La diferencia entre
del
ypop
es que, usando elpop()
método, podemos almacenar el valor de la clave si es necesario, como lo siguiente:Bifurca esta esencia para referencia futura, si encuentras esto útil.
fuente
if myDict.get('one')
para verificar si hay una llave presente! Falla si myDict ['one'] tiene un valor falso. Además, los dictos no tienen un orden inherente, por lo que no tiene sentido mencionarlo.Puede usar el manejo de excepciones si desea ser muy detallado:
Sin embargo, esto es más lento que el
pop()
método, si la clave no existe.Para algunas teclas no importará, pero si lo hace repetidamente, entonces el último método es una mejor opción.
El enfoque más rápido es este:
Pero este método es peligroso porque si
'key'
se elimina entre las dos líneas, seKeyError
elevará a.fuente
Prefiero la versión inmutable
fuente
Otra forma es mediante el uso de elementos () + comprensión dict
items () junto con la comprensión de dict también pueden ayudarnos a lograr la tarea de eliminación de pares clave-valor, pero tiene el inconveniente de no ser una técnica de dict in situ. En realidad, se crea un nuevo dict, excepto la clave que no deseamos incluir.
Salida:
fuente
Filtro único en llave
Múltiples filtros en llaves
fuente