J'ai lu toutes les réponses dans ce fil et certaines se réfèrent également à ce fil : Suppression des dicts vides dans un dictionnaire imbriqué avec une fonction récursive
J'ai d'abord utilisé cette solution ici et elle a très bien fonctionné :
Tentative 1 : Trop chaud (pas performant ou à l'épreuve du temps) :
def scrub_dict(d):
if type(d) is dict:
return dict((k, scrub_dict(v)) for k, v in d.iteritems() if v and scrub_dict(v))
else:
return d
Mais certains problèmes de performance et de compatibilité ont été soulevés dans le monde de Python 2.7 :
- utiliser
isinstance
au lieu de type
- dérouler la liste comp en
for
boucle pour l'efficacité
- utiliser python3 en toute sécurité
items
au lieu de iteritems
Tentative 2 : Trop froid (manque de mémorisation) :
def scrub_dict(d):
new_dict = {}
for k, v in d.items():
if isinstance(v,dict):
v = scrub_dict(v)
if not v in (u'', None, {}):
new_dict[k] = v
return new_dict
DOH ! Ce n'est pas récursif et pas du tout mémoïsant.
Tentative 3 : Juste ce qu'il faut (jusqu'à présent) :
def scrub_dict(d):
new_dict = {}
for k, v in d.items():
if isinstance(v,dict):
v = scrub_dict(v)
if not v in (u'', None, {}):
new_dict[k] = v
return new_dict