web-dev-qa-db-fra.com

Compréhension imbriquée dans le dictionnaire python

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, ...}, ...}
18
Turtles Are Cute

{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.

25
Blender

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).

25
Zero Piraeus
{ok: {ik: myfunc(iv) for ik, iv in ov.items()} for ok, ov in od.items()}  


ok-clé extérieure
ik-inner key
sur-valeur extérieure
iv-inner value od-outer dictionary Voici comment je me souviens.

0
Gajendra D Ambi