2017-02-12 1 views
1

私はネストされたdictsとキー値のdictを持っています。Python3 - forループを使用してdictsのdictを繰り返し処理できますか?

dicta = {'key1': {'keya': 'a', 'keyb': 'b'}, 
     'key2': {'key3':{'keyc': 'c'}}, 'key4': 4}} 

forループを使用して 'c'にアクセスする方法はありますか?

私は、最初の印刷のために

print(dicta['key2']) 

for x in dicta['key2']: 
    for y in x['key3']: 
     print(y) 

を試してみました、私は

{'key3': {'keyc': 'c'}} 

を取得しかし、私はTypeError例外を取得:文字列のインデックスは、第二の印刷のための整数でなければなりません。

ありがとうございます! * nをdictaに置き換えて編集しました。私は最初に間違ってコピーして貼り付けた。

+2

あなたはここに*反復*べきであるようにそれは見えません。おそらく単に 'dicta ['key2'] ['key3']'が必要です。 – user2357112

答えて

1

一般的に、 Dictsは任意に再帰的に深くすることができ、ループを使用してそれらをトラバースする良い方法はありません。forループ。 (あなたは、リストを使用して、独自のスタックを実装し、再帰をシミュレートするが、それは「良い」ではありませんでした。)

を確認、具体的にthis question.

で(深さを数える)の辞書を横断するため、いくつかの再帰的なコードがあります。あなたが与えられた辞書に飛び込むと、キーとその値を出力するために再帰を使用することができます

n = {'key1': {'keya': 'a', 'keyb': 'b'}, 
    'key2': {'key3':{'keyc': 'c'}}, 'key4': 4} 

for k1,v1 in n.items(): 
    try: 
     for k2,v2 in v1.items(): 
      try: 
       for k3,v3 in v2.items(): 
        print(v3) 
      except AttributeError: 
       pass 
    except AttributeError: 
     pass 
+0

forループを使用せずに、それらをトラバースする標準的な方法は何ですか? – user7552322

+2

スタック(深さの最初の検索)、キュー(幅の広い最初の検索)、または再帰を持つもののいずれかをシミュレートします。 – BallpointBen

0

:事前に構造を知ることは、あなたはforループの正しい数を使用することができます。

def drill(dicta): 
    for k in dicta.keys(): 
    if isinstance(dicta[k],dict): 
     drill(dicta[k]) 
    else: 
     print ('dicta[',k,']=',dicta[k]) 
    return 
1

for i in somedictは、すべてのキーを辞書からループします。 はdict views

When looping through dictionaries, the key and corresponding value can be retrieved at the same time using the items() method.

items()辞書の項目の新しいビュー((キー、値)のペア)を返すから詳細をご覧ください。オブジェクト引数がdict引数のインスタンスである場合

for k,v in dicta['key2'].items(): 
    if isinstance(v,dict): 
     for k1,v1 in v.items(): 
      print(v1) 

isinstance(v,dict)リターン真ので、あなたは、例外をキャッチする必要はありません。 だから、あなたはこれを試すことができます。

は、このことができますlooping-techniques

希望を見てください。

0
for k in n: 
    v = n.get(k) 
    if isinstance(v, dict): 
    for j in v: 
     print(v.get(j)) 
0

ネストループを使用すると、必要な結果が得られます。

for k,v in dicta.items(): 
    if k=="key2": 
     new_dict=v 
     for k1, v1 in new_dict.items(): 
       print v1["keyc"] 
+0

ようこそスタックオーバーフロー!このユーザーの問題を解決しているかもしれませんが、将来この問題に遭遇するユーザーにとってはコードオンリーの回答はあまり役に立ちません。あなたのコードが元の問題を解決する理由を説明するために、あなたの答えを編集してください。 –

関連する問題