Je ne parviens pas à comprendre les interprétations de dictionnaire imbriquées dans Python 3. Le résultat obtenu dans l'exemple ci-dessous génère la structure correcte sans erreur, mais n'inclut qu'une des paires clé intérieure: valeur. Je n'ai pas trouvé d'exemple de compréhension de dictionnaire imbriqué comme celui-ci; Googler "python de compréhension de dictionnaire imbriqué" affiche des exemples hérités, des interprétations non imbriquées ou des réponses résolues à l'aide d'une approche différente. J'utilise peut-être la mauvaise syntaxe.
Exemple:
data = {outer_k: {inner_k: myfunc(inner_v)} for outer_k, outer_v in outer_dict.items() for inner_k, inner_v in outer_v.items()}
Cet exemple doit renvoyer le dictionnaire d'origine, mais avec la valeur interne modifiée par myfunc
.
Structure du dictionnaire outer_dict, ainsi que le résultat:
{outer_k: {inner_k: inner_v, ...}, ...}
{inner_k: myfunc(inner_v)}
n'est pas une compréhension du dictionnaire. C'est juste un dictionnaire.
Vous cherchez probablement quelque chose comme ceci à la place:
data = {outer_k: {inner_k: myfunc(inner_v) for inner_k, inner_v in outer_v.items()} for outer_k, outer_v in outer_dict.items()}
Pour des raisons de lisibilité, n'embarquez pas trop la compréhension du dictionnaire et de la liste.
Ajout de sauts de ligne et d'indentation:
data = {
outer_k: {inner_k: myfunc(inner_v)}
for outer_k, outer_v in outer_dict.items()
for inner_k, inner_v in outer_v.items()
}
... il est évident que vous n'avez en réalité qu'une seule compréhension de dict "en deux dimensions". Ce que vous voulez réellement, c'est probablement:
data = {
outer_k: {
inner_k: myfunc(inner_v)
for inner_k, inner_v in outer_v.items()
}
for outer_k, outer_v in outer_dict.items()
}
(ce qui est exactement ce que Blender a suggéré dans sa réponse, avec des espaces ajoutés).
{ok: {ik: myfunc(iv) for ik, iv in ov.items()} for ok, ov in od.items()}
où
ok-clé extérieure
ik-inner key
sur-valeur extérieure
iv-inner value od-outer dictionary Voici comment je me souviens.