python - Eliminar un elemento de un diccionario




7 Answers

pop muta el diccionario.

 >>>lol = {"hello":"gdbye"}
 >>>lol.pop("hello")
    'gdbye'
 >>> lol
     {}

Si desea conservar el original, simplemente puede copiarlo.

python dictionary pop del

¿Hay alguna forma de eliminar un elemento de un diccionario en Python?

Además, ¿cómo puedo eliminar un elemento de un diccionario para devolver una copia (es decir, sin modificar el original)?




La declaración del es lo que estás buscando. Si tienes un diccionario llamado foo con una clave llamada 'barra', puedes eliminar la 'barra' de foo así:

del foo['bar']

Tenga en cuenta que esto modifica permanentemente el diccionario que se está operando. Si desea conservar el diccionario original, deberá crear una copia de antemano:

>>> foo = {'bar': 'baz'}
>>> fu = dict(foo)
>>> del foo['bar']
>>> print foo
{}
>>> print fu
{'bar': 'baz'}

La llamada de dict hace una copia superficial. Si desea una copia profunda, utilice copy.deepcopy .

Aquí hay un método que puede copiar y pegar, para su conveniencia:

def minus_key(key, dictionary):
    shallow_copy = dict(dictionary)
    del shallow_copy[key]
    return shallow_copy



d = {1: 2, '2': 3, 5: 7}
del d[5]
print 'd = ', d

Resultado: d = {1: 2, '2': 3}




... ¿cómo puedo eliminar un elemento de un diccionario para devolver una copia (es decir, sin modificar el original)?

Un dict es la estructura de datos incorrecta que se utiliza para esto.

Claro, copiar el dictado y hacer estallar desde las obras de copia, y también lo hace la construcción de un nuevo dictado con una comprensión, pero toda esa copia lleva tiempo: ha reemplazado una operación de tiempo constante con una de tiempo lineal. Y todas esas copias vivas toman espacio al mismo tiempo: espacio lineal por copia.

Otras estructuras de datos, como los intentos mapeados de la matriz de hash , están diseñados para este tipo de casos de uso: la adición o eliminación de un elemento devuelve una copia en tiempo logarítmico, compartiendo la mayor parte de su almacenamiento con el original . 1

Por supuesto hay algunas desventajas. El rendimiento es logarítmico en lugar de constante (aunque con una base grande, generalmente 32-128). Y, aunque puede hacer que la API no mutante sea idéntica a la dict , la API "mutante" es obviamente diferente. Y, sobre todo, no hay baterías HAMT incluidas con Python. 2

La biblioteca pyrsistent es una implementación bastante sólida de reemplazos de dict basados ​​en HAMT (y varios otros tipos) para Python. Incluso tiene una API de nifty evolver para portar el código mutante existente a un código persistente de la mejor manera posible. Pero si desea ser explícito acerca de devolver copias en lugar de mutar, simplemente lo utiliza así:

>>> from pyrsistent import m
>>> d1 = m(a=1, b=2)
>>> d2 = d1.set('c', 3)
>>> d3 = d1.remove('a')
>>> d1
pmap({'a': 1, 'b': 2})
>>> d2
pmap({'c': 3, 'a': 1, 'b': 2})
>>> d3
pmap({'b': 2})

Que d3 = d1.remove('a') es exactamente lo que está preguntando la pregunta.

Si tiene estructuras de datos mutables como dict y list incrustadas en el pmap , seguirá teniendo problemas con el alias; solo puede solucionarlo si se mantiene inmutable hasta el fondo, incorporando pmap sy pvector s.

1. Los HAMT también se han hecho populares en lenguajes como Scala, Clojure, Haskell porque juegan muy bien con la programación sin bloqueo y la memoria transaccional del software, pero ninguno de ellos es muy relevante en Python.

2. De hecho, hay un HAMT en el stdlib, utilizado en la implementación de contextvars . El PEP retirado anteriormente explica por qué. Pero este es un detalle de implementación oculto de la biblioteca, no un tipo de colección pública.




>>> def delete_key(dict, key):
...     del dict[key]
...     return dict
... 
>>> test_dict = {'one': 1, 'two' : 2}
>>> print delete_key(test_dict, 'two')
{'one': 1}
>>>

esto no hace ningún manejo de errores, asume que la clave está en el dictado, es posible que desee comprobar eso primero y raise si no está




agradable de una sola línea para verificar si la clave está presente, eliminarla, devolver el valor o el valor predeterminado:

ret_val = ('key' in body and body.pop('key')) or 5



Aquí hay otra variación usando lista de comprensión:

original_d = {'a': None, 'b': 'Some'}
d = dict((k,v) for k, v in original_d.iteritems() if v)
# result should be {'b': 'Some'}

El enfoque se basa en una respuesta de este post: una manera eficiente de eliminar claves de cadenas de un dict.




Related