Al eliminar una clave de un diccionario, uso:
if 'key' in my_dict: del my_dict['key']¿Hay una forma de una línea de hacer esto?
Puede usar una comprensión de diccionario para crear un nuevo diccionario con esa clave eliminada:
>>> my_dict = {k: v for k, v in my_dict.items() if k != 'key'} Puede eliminar por condiciones. No hay error si la key no existe.
del my_dict[key] es un poco más rápido que my_dict.pop(key) para eliminar una clave de un diccionario cuando la clave existe
>>> import timeit >>> setup = "d = {i: i for i in range(100000)}" >>> timeit.timeit("del d[3]", setup=setup, number=1) 1.79e-06 >>> timeit.timeit("d.pop(3)", setup=setup, number=1) 2.09e-06 >>> timeit.timeit("d2 = {key: val for key, val in d.items() if key != 3}", setup=setup, number=1) 0.00786 Pero cuando la clave no existe if key in my_dict: del my_dict[key] es ligeramente más rápida que my_dict.pop(key, None) . Ambos son al menos tres veces más rápidos que del en una sentencia try / except :
>>> timeit.timeit("if 'missing key' in d: del d['missing key']", setup=setup) 0.0229 >>> timeit.timeit("d.pop('missing key', None)", setup=setup) 0.0426 >>> try_except = """ ... try: ... del d['missing key'] ... except KeyError: ... pass ... """ >>> timeit.timeit(try_except, setup=setup) 0.133Si necesita eliminar muchas claves de un diccionario en una línea de código, creo que usar map() es bastante sucinto 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 en los que aparece un valor que no está en el diccionario, use lambda dentro del mapa () de esta manera:
map(lambda x: myDict.pop(x,None), ['a', 'c', 'e']) [1, 3, None] # pop returns >>> myDict {'b': 2, 'd': 4} o en python3 , debe usar una lista de comprensión en su lugar:
[myDict.pop(x, None) for x in ['a', 'c', 'e']]Funciona. Y 'e' no causó un error, aunque myDict no tenía una tecla 'e'.
Para eliminar una clave sin importar si está en el diccionario, use la forma de dos argumentos de dict.pop() :
my_dict.pop('key', None) Esto devolverá my_dict[key] si la key existe en el diccionario, y None en caso contrario. Si no se especifica el segundo parámetro (es decir my_dict.pop('key') ) y key no existe, se genera un KeyError .
Para eliminar una clave cuya existencia está garantizada, también puede utilizar:
del my_dict['key'] Esto generará un KeyError si la clave no está en el diccionario.
Específicamente para responder "¿hay una forma de una línea de hacer esto?"
if 'key' in my_dict: del my_dict['key']...bueno, tú 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 my_dict durante la declaración if , pero puede eliminarse antes de que se ejecute del , en cuyo caso del será falla con un KeyError . Dado esto, sería más seguro usar dict.pop o algo similar a
try: del my_dict['key'] except KeyError: passque, por supuesto, definitivamente no es una sola línea.
Me tomó un tiempo averiguar qué está haciendo exactamente my_dict.pop("key", None) . Así que agregaré esto como respuesta para ahorrar tiempo de búsqueda en Google:
pop(key[, default])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
KeyError.
Puede usar el manejo de excepciones si quiere ser muy detallado:
try: del dict[key] except KeyError: pass Sin embargo, esto es más lento que el método pop() , si la clave no existe.
my_dict.pop('key', None)No importará para algunas teclas, pero si lo haces repetidamente, entonces el último método es una mejor opción.
El enfoque más rápido es este:
if 'key' in dict: del myDict['key'] Pero este método es peligroso porque si se elimina la 'key' entre las dos líneas, se generará un KeyError .
Prefiero la versión inmutable.
foo = { 1:1, 2:2, 3:3 } removeKeys = [1,2] def woKeys(dct, keyIter): return { k:v for k,v in dct.items() if k not in keyIter } >>> print(woKeys(foo, removeKeys)) {3: 3} >>> print(foo) {1: 1, 2: 2, 3: 3}Usando la palabra clave "del":
del dict[key]Podemos eliminar una clave de un diccionario de Python mediante algunos de los siguientes enfoques.
Usando la palabra clave del ; Sin embargo, es casi el mismo enfoque que tú:
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 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 igual 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 como {'five': 500, 'four': 400, 'three': 300, 'two': 200} - tenga en cuenta que no es el mismo ordenado que myDict . Nuevamente, si intentamos imprimir myDict , podemos ver todas las claves, incluidas las que excluimos del diccionario con este enfoque. Sin embargo, podemos hacer 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 tratamos de imprimirlo, seguirá el orden principal:
print(var) # {'two': 200, 'three': 300, 'four': 400, 'five': 500}O
Usando 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, usando el método pop() , podemos almacenar el valor de la clave si es necesario, como se muestra a continuación:
myDict = {'one': 100, 'two': 200, 'three': 300} if myDict.get('one') : var = myDict.pop('one') print(myDict) # {'two': 200, 'three': 300} print(var) # 100Bifurque esta esencia para referencia futura, si lo encuentra útil.
esto cambiará
my_dicten su lugar (mutable)
my_dict.pop('key', None)generar un nuevo dict (inmutable)
dic1 = { "x":1, "y": 2, "z": 3 } def func1(item): return item[0]!= "x" and item[0] != "y" print( dict( filter( lambda item: item[0] != "x" and item[0] != "y", dic1.items() ) ) )El tipo de datos del diccionario tiene un método llamado dict_name.pop(item) y se puede usar para eliminar un par clave:valor de un diccionario.
a={9:4,2:3,4:2,1:3} a.pop(9) print(a)Esto dará la salida como:
{2: 3, 4: 2, 1: 3}De esta manera, puede eliminar un elemento de un diccionario en una línea.
Otra forma es usando items() + dict comprension.
items() junto con la comprensión de dictados también pueden ayudarnos a lograr la tarea de eliminar el par clave-valor, pero tiene el inconveniente de no ser una técnica de dictado en su lugar. En realidad, se crea un nuevo dictado excepto por la clave que no deseamos incluir.
test_dict = {"sai" : 22, "kiran" : 21, "vinod" : 21, "sangam" : 21} # Printing dictionary before removal print ("dictionary before performing remove is : " + str(test_dict)) # Using items() + dict comprehension to remove a dict. pair # removes vinod new_dict = {key:val for key, val in test_dict.items() if key != 'vinod'} # Printing dictionary after removal print ("dictionary after remove is : " + str(new_dict))Producción:
dictionary before performing remove is : {'sai': 22, 'kiran': 21, 'vinod': 21, 'sangam': 21} dictionary after remove is : {'sai': 22, 'kiran': 21, 'sangam': 21}También podría usar el filter con lambda :
>>> d = {'a': 1, 'b': 2, 'c': 3} >>> dict(filter(lambda x: x[0] != 'a', d.items())) {'b': 2, 'c': 3} >>>Prueba esto
if key in data: del data[key]