Si vous avez vraiment besoin de modifier le dictionnaire d'origine:
empty_keys = [k for k,v in metadata.iteritems() if not v]
for k in empty_keys:
del metadata[k]
Notez que nous devons faire une liste des clés vides car nous ne pouvons pas modifier un dictionnaire en l'itérant (comme vous l'avez peut-être remarqué). Cela coûte moins cher (en termes de mémoire) que de créer un tout nouveau dictionnaire, à moins qu'il n'y ait beaucoup d'entrées avec des valeurs vides.
nneonneo
la source
la source
.iteritems()
par.items()
, le premier ne fonctionne plus dans les dernières versions de Python.Réponses:
La solution de BrenBarn est idéale (et pythonique, pourrais-je ajouter). Voici cependant une autre solution (fp):
la source
Si vous souhaitez une approche complète, mais succincte, de la gestion des structures de données du monde réel qui sont souvent imbriquées et peuvent même contenir des cycles, je vous recommande de consulter l'utilitaire de remappage du package d'utilitaires boltons .
Après
pip install boltons
ou en copiant iterutils.py dans votre projet, faites simplement:Cette page contient de nombreux autres exemples, y compris ceux fonctionnant avec des objets beaucoup plus volumineux de l'API de Github.
C'est pur-Python, donc cela fonctionne partout, et est entièrement testé en Python 2.7 et 3.3+. Mieux encore, je l'ai écrit pour exactement des cas comme celui-ci, donc si vous trouvez un cas qu'il ne gère pas, vous pouvez me déranger pour le réparer ici .
la source
Basé sur la solution de Ryan , si vous avez également des listes et des dictionnaires imbriqués:
Pour Python 2:
Pour Python 3:
la source
d = { "things": [{ "name": "" }] }
Si vous avez un dictionnaire imbriqué et que vous voulez que cela fonctionne même pour des sous-éléments vides, vous pouvez utiliser une variante récursive de la suggestion de BrenBarn:
la source
items()
place deiteritems()
pour Python 3Réponse rapide (TL; DR)
Exemple01
Réponse détaillée
Problème
Solution
Pièges
Autre exemple
Exemple02
Voir également
la source
Pour python 3
la source
En vous basant sur les réponses de patriciasz et nneonneo , et en tenant compte de la possibilité que vous souhaitiez supprimer des clés qui n'ont que certaines fausses choses (par exemple
''
) mais pas d'autres (par exemple0
), ou peut-être que vous voulez même inclure des choses véridiques (par exemple'SPAM'
) , vous pouvez alors créer une liste de résultats très spécifique:Malheureusement, cela ne fonctionne pas tout à fait, car par exemple
0 in unwanted
évalue àTrue
. Nous devons faire la distinction entre les0
choses fausses et d'autres, nous devons donc utiliseris
:... évalue à
False
.Maintenant, utilisez-le pour
del
les choses indésirables:Si vous voulez un nouveau dictionnaire, au lieu de le modifier
metadata
sur place:la source
[]
J'ai lu toutes les réponses dans ce fil et certaines se sont également référées à ce fil: Supprimez les dicts vides dans le dictionnaire imbriqué avec fonction récursive
J'ai initialement utilisé la solution ici et cela a très bien fonctionné:
Tentative 1: Trop chaud (pas performant ni à l'épreuve du temps) :
Mais certains problèmes de performances et de compatibilité ont été soulevés dans le monde Python 2.7:
isinstance
au lieu detype
for
boucle pour plus d'efficacitéitems
au lieu deiteritems
Tentative 2: Trop froid (manque de mémorisation) :
DOH! Ce n'est pas récursif et pas du tout mémoizant.
Tentative 3: juste bien (jusqu'à présent) :
la source
Dicts mélangés à des tableaux
if isinstance(v, list):
, qui nettoie la liste en utilisant l'scrub_dict(d)
implémentation d' origine .la source
Une autre façon de procéder consiste à utiliser la compréhension du dictionnaire. Cela devrait être compatible avec
2.7+
la source
Voici une option si vous utilisez
pandas
:la source
Certaines des méthodes mentionnées ci-dessus ignorent s'il y a des entiers et des flottants avec des valeurs 0 et 0,0
Si quelqu'un veut éviter ce qui précède, vous pouvez utiliser le code ci-dessous (supprime les chaînes vides et les valeurs None du dictionnaire imbriqué et de la liste imbriquée):
la source
«Comme j'écris actuellement une application de bureau pour mon travail avec Python, j'ai trouvé dans l'application de saisie de données quand il y a beaucoup d'entrées et que certaines ne sont pas obligatoires, l'utilisateur peut donc le laisser vide, à des fins de validation, il est facile de saisir toutes les entrées, puis supprimer la clé vide ou la valeur d'un dictionnaire. Donc, mon code ci-dessus montre comment nous pouvons facilement les supprimer, en utilisant la compréhension du dictionnaire et en conservant l'élément de valeur du dictionnaire qui n'est pas vide. J'utilise Python 3.8.3
la source
Quelques analyses comparatives:
1. Compréhension de liste recréer dict
2. Compréhension de liste recréer dict en utilisant dict ()
3. Bouclez et supprimez la clé si v est Aucun
Ainsi, la boucle et la suppression sont les plus rapides à 160ns, la compréhension de la liste est deux fois moins lente à ~ 375ns et avec un appel à
dict()
est à nouveau deux fois moins lente à ~ 680ns.L'emballage de 3 dans une fonction le ramène à environ 275 ns. Aussi pour moi PyPy était environ deux fois plus rapide que neet python.
la source
list(dic.items())
py 3. Dict compréhension ftw alors? del semble toujours plus rapide pour un faible ratio de valeurs nulles / vides. Je suppose que la construction de cette liste est tout aussi mauvaise pour la consommation de mémoire que la simple recréation du dict.