16

Python 3で入れ子になっている辞書の理解を理解できません。以下の例から得られた結果は正しい構造体をエラーなしで出力しますが、内側のkey:valueの組み合わせの1つのみを含みます。私はこのようなネストされた辞書の理解の例を見出していない。グーグル「ネストされた辞書理解Python」は、従来の例、非ネストされた理解、または異なるアプローチを使用して解決された解答を示しています。私は間違った構文を使用している可能性があります。入れ子の辞書理解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, ...}, ...} 

答えて

20

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

。いくつかの改行やインデントを追加する

+1

大変ありがとうございます。これは誰でも助けてくれてありがとうございました。ここで私は混乱しています。Blenderのソリューションには、私の前から2つの変更点があります:移動されたブラケット、内側の 'for'を外側に置きます。私はもともとfor節が正しく設定されていましたが、間違った場所にかっこがあり、 "NameError:グローバル名 'outer_v"が定義されていません。 "正しい場所。 –

20

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次元」のdictの理解を持っていることになります。あなたが実際にしたいことはおそらくです:

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が追加空白で、彼の答えで提案されているまさにです)。

+0

また非常に役に立ちます。forループ内の1軸のdict compと、審美的に線で分ける最善の方法を比較してみましょう。 –

関連する問題