Quand on a des dictionnaires emboîtés les uns dans les autres, on a
parfois besoin de travailler sur l'un des dictionnaires internes.
Ça peut donc être sympa d'avoir une fonction qui traverse le dict global
pour nous, en lui donnant le chemin
def run_through_dict(d, path):
""" d is a nested dict
path is the list of keys that takes to the value (or nested dict)
we want to retrieve.
"""
if not path:
return di
return run_through_dict(d[path.pop()], path)
Petites explications :
path représente la liste des clés de vos différents nested dicts que
vous voulez parcourir, mais dans le sens inverse. C'est dû au fait que
path.pop() retourne (et supprime de la liste) le dernier élément de la
liste. Il faut donc mettre la clé de plus haut niveau dans l'arbre en
dernier.
Example :
In [1]: my_dict = {
"key1": 1,
"key2": 2,
"key3": 3,
"key4": {
"key5": 5,
"key6": {
"key7": 7,
}
}
}
In [2]: path = ["key7", "key6", "key4"]
In [3]: print run_through(my_dict, path)
7
Alors évidemment, ça nécessite de connaître le chemin complet pour
accéder à la valeur désirée, mais pour parser du JSON dont on connais le
schéma, ça peut être sympa !