2017-08-23 25 views
-2

私はPythonを初めて使いました。私は(k1、(t1、v1))のようなネストされた辞書を持っています。私は各v1の値を効率的にループしたいと思います。ネストされたPython辞書を効率的に反復する

私の辞書はmy_dictだと言うことができます。フラットナーや辞書の理解力を使って、2つのループを効率よくk、x、yにアクセスしたい私にベストプラクティスを教えてください。

 for k, v in my_dict.iteritems(): 
     inner_dict = my_dict.get(k) 
     for x, y in inner_dict.iteritems(): 
      print(k, x , y) 
+0

forループは問題ありません。フラットナーとは何ですか? –

+1

'inner_dict = my_dict.get(k)'は必要ありません。あなたはすでに 'v'を持っています。 – khelwood

+1

代わりに 'v.iteritems()'を反復することができるなら 'inner_dict = my_dict.get(k)'を使うのはなぜですか? – MSeifert

答えて

3

あなたが値でのみ興味があるなら項目をループする必要はありません:

flattened_values = (v for dct in my_dict.itervalues() for v in dct.itervalues()) 
for value in flattened_values: 
    print(value) 

編集

あなたの編集に基づいて、あなたにも鍵が必要です。その場合、冗長コードinner_dict = my_dict.get(k)とは別に、コードは基本的にはvです。同じライナーの場合は、次のようになります。

for v in ((k1, k2, v2) for k1, v1 in my_dict.iteritems() for k2, v2 in v1.iteritems()): 
    print(v) 
+1

'next(dct.itervalues())'を「ベストプラクティス」とみなすべきかどうかは不明です。 – MSeifert

+0

@MSeifert良い点。更新しました。 –

+0

IMO、OPの入れ子の* for *バージョンは、両方のループで '.itervalues'を使うべきであることを除いて、まだまだ良いと思います。 –

関連する問題