¿Cuál es la mejor manera de eliminar un elemento de un diccionario por valor, es decir, cuando se desconoce la clave del elemento? He aquí un enfoque simple:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
¿Hay mejores formas? ¿Hay algún problema con la mutación (eliminación de elementos) del diccionario mientras se itera?
python
dictionary
Botones840
fuente
fuente
Respuestas:
Tenga en cuenta que actualmente está probando la identidad del objeto (
is
solo devuelveTrue
si ambos operandos están representados por el mismo objeto en la memoria; este no siempre es el caso con dos objetos que se comparan igual con==
). Si está haciendo esto a propósito, entonces podría reescribir su código comoPero esto puede no hacer lo que quieres:
Así que probablemente quieras en
!=
lugar deis not
.fuente
some_dict.iteritems()
aquí y ponerfor
yif
declaraciones en líneas separadas paraiteritems
ahora lo estoyitems
. En Python 2.7, deiteritems()
hecho es mejor.dict()
con una expresión generadora adecuada, que es 2.4. meta: puede navegar por los peps aquí para encontrar cosas.El
dict.pop(key[, default])
método le permite eliminar elementos cuando conoce la clave. Devuelve el valor en la clave si elimina el elemento; de lo contrario, devuelve lo que se pasa comodefault
. Consulte los documentos .Ejemplo:
fuente
fuente
Una simple comparación entre del y pop () :
resultado:
Entonces, del es más rápido que pop () .
fuente
pop()
(como lo hace @ n-1-1 anteriormente), que no es una opción para eldel
operador.timeit
. Gracias por este claro ejemplo.items()
devuelve una lista, y es esa lista la que está iterando, por lo que mutar el dict en el ciclo no importa aquí. Si estuviera usando en suiteritems()
lugar, mutar el dict en el bucle sería problemático , y tambiénviewitems()
en Python 2.7.No puedo pensar en una mejor manera de eliminar elementos de un dictado por valor.
fuente
Construiría una lista de claves que deben eliminarse y luego las eliminaría. Es simple, eficiente y evita cualquier problema de iterar y mutar simultáneamente el dict.
fuente
c es el nuevo diccionario y a es su diccionario original, {'z', 'w'} son las claves que desea eliminar de un
Consulte también: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html
fuente
fuente
No hay nada de malo en eliminar elementos del diccionario mientras se itera, como ha propuesto. Tenga cuidado con varios subprocesos que utilizan el mismo diccionario al mismo tiempo, lo que puede provocar un KeyError u otros problemas.
Por supuesto, consulte los documentos en http://docs.python.org/library/stdtypes.html#typesmapping
fuente
for k,v in d.iteritems(): del d[k]
daríaRuntimeError: dictionary changed size during iteration
. Vea la explicación de mithrandi.Así es como lo haría yo.
fuente