web-dev-qa-db-ja.com

ネストされた辞書の理解python

Python 3.でネストされた辞書の内包表記を理解するのに問題があります。以下の例から取得した結果は、エラーなしで正しい構造を出力しますが、内部キー:値のペアの1つのみを含みます。このようなネストされた辞書内包表記の例は見つかりませんでした。「入れ子になった辞書内包表記python」は、レガシーな例、ネストされていない内包表記、または別のアプローチを使用して解決された回答を示しています。間違った構文を使用している可能性があります。

例:

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()}

この例では、元の辞書が返されますが、内部値はmyfuncによって変更されています。

Outer_dict辞書の構造と結果:

{outer_k: {inner_k: inner_v, ...}, ...}
25

{inner_k: myfunc(inner_v)}は辞書内包ではありません。それは単なる辞書です。

代わりに、おそらく次のようなものを探しています。

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()}

読みやすくするために、辞書内包表記をネストしたり、内包表記をあまりリストに入れたりしないでください。

32
Blender

いくつかの改行とインデントを追加します:

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()
}

...実際に単一の「2次元」の辞書理解があることを明らかにします。あなたが実際に欲しいのはおそらく:

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()
}

(これは、Blenderが彼の回答で提案したもので、空白が追加されています)。

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

どこ
ok-outerキー
ik-inner key
ov-outer値
iv-inner value od-outer dictionaryこれは私が覚えている方法です。

2
Gajendra D Ambi