Si realmente necesita modificar el diccionario original:
empty_keys = [k for k,v in metadata.iteritems() if not v]
for k in empty_keys:
del metadata[k]
Tenga en cuenta que tenemos que hacer una lista de las claves vacías porque no podemos modificar un diccionario mientras iteramos a través de él (como habrá notado). Sin embargo, esto es menos costoso (en términos de memoria) que crear un diccionario nuevo, a menos que haya muchas entradas con valores vacíos.
neonneo
fuente
fuente
.iteritems()
con.items()
, la primera ya no funciona en las versiones más recientes de Python.Respuestas:
La solución de BrenBarn es ideal (y pitónica, debo agregar). Sin embargo, aquí hay otra solución (fp):
fuente
Si desea un enfoque con todas las funciones, pero conciso, para manejar estructuras de datos del mundo real que a menudo están anidadas e incluso pueden contener ciclos, le recomiendo mirar la utilidad de reasignación del paquete de utilidades de boltons .
Después de
pip install boltons
copiar iterutils.py en su proyecto, simplemente haga lo siguiente:Esta página tiene muchos más ejemplos, incluidos los que trabajan con objetos mucho más grandes de la API de Github.
Es Python puro, por lo que funciona en todas partes y está completamente probado en Python 2.7 y 3.3+. Lo mejor de todo es que lo escribí exactamente para casos como este, así que si encuentra un caso que no maneja, puede pedirme que lo solucione aquí mismo .
fuente
Basado en la solución de Ryan , si también tiene listas y diccionarios anidados:
Para Python 2:
Para Python 3:
fuente
d = { "things": [{ "name": "" }] }
Si tiene un diccionario anidado y desea que esto funcione incluso para subelementos vacíos, puede usar una variante recursiva de la sugerencia de BrenBarn:
fuente
items()
lugar deiteritems()
para Python 3Respuesta rápida (TL; DR)
Example01
Respuesta detallada
Problema
Solución
Trampas
Ejemplo alternativo
Ejemplo02
Ver también
fuente
Para python 3
fuente
Basándose en las respuestas de patriciasz y nneonneo , y teniendo en cuenta la posibilidad de que desee eliminar claves que solo tienen ciertas cosas falsas (por ejemplo
''
) pero no otras (por ejemplo0
), o tal vez incluso desee incluir algunas cosas verdaderas (por ejemplo'SPAM'
) , entonces podría hacer una lista de resultados muy específica:Desafortunadamente, esto no funciona del todo porque, por ejemplo, se
0 in unwanted
evalúa comoTrue
. Necesitamos discriminar entre0
otras cosas falsas, así que tenemos que usaris
:... evalúa a
False
.Ahora utilícelo para
del
las cosas no deseadas:Si desea un diccionario nuevo, en lugar de modificarlo
metadata
en su lugar:fuente
[]
Leí todas las respuestas en este hilo y algunas se refirieron también a este hilo: Eliminar dictados vacíos en el diccionario anidado con función recursiva
Originalmente usé la solución aquí y funcionó muy bien:
Intento 1: demasiado caliente (sin rendimiento ni preparado para el futuro) :
Pero se plantearon algunas preocupaciones de rendimiento y compatibilidad en el mundo de Python 2.7:
isinstance
lugar detype
for
bucle para mayor eficienciaitems
lugar deiteritems
Intento 2: demasiado frío (carece de memorización) :
DOH! Esto no es recursivo ni memorable en absoluto.
Intento 3: Justo a la derecha (hasta ahora) :
fuente
Dictados mezclados con matrices
if isinstance(v, list):
, que limpia la lista usando lascrub_dict(d)
implementación original .fuente
Una forma alternativa de hacerlo es mediante la comprensión del diccionario. Esto debería ser compatible con
2.7+
fuente
Aquí hay una opción si está utilizando
pandas
:fuente
Algunos de los métodos mencionados anteriormente ignoran si hay números enteros y flotan con valores 0 y 0.0
Si alguien quiere evitar lo anterior, puede usar el siguiente código (elimina las cadenas vacías y los valores Ninguno del diccionario anidado y la lista anidada):
fuente
"Como actualmente también escribo una aplicación de escritorio para mi trabajo con Python, encontré en la aplicación de entrada de datos cuando hay muchas entradas y algunas no son obligatorias, por lo que el usuario puede dejarla en blanco, para fines de validación, es fácil de tomar todas las entradas y luego descartar la clave vacía o el valor de un diccionario. Entonces, mi código anterior muestra cómo podemos eliminarlos fácilmente, usando la comprensión del diccionario y manteniendo el elemento de valor del diccionario que no está en blanco. Yo uso Python 3.8.3
fuente
Algunas evaluaciones comparativas:
1. Lista de comprensión recrear dict
2. Lista de comprensión recrear dict usando dict ()
3. Repetir y eliminar la tecla si v es Ninguno
por lo que repetir y eliminar es el más rápido a 160 ns, la comprensión de la lista es la mitad de lenta a ~ 375 ns y con una llamada a
dict()
es la mitad de lenta de nuevo a ~ 680 ns.Envolver 3 en una función lo vuelve a bajar a aproximadamente 275ns. También para mí, PyPy fue aproximadamente el doble de rápido que neet python.
fuente
list(dic.items())
en py 3. ¿Dict comprensión ftw entonces? del todavía parece más rápido para una relación baja de valores nulos / vacíos. Supongo que construir esa lista es tan malo para el consumo de memoria que simplemente recrear el dict.