2017-11-23 10 views
0

私は辞書を持っている: mydict = {1: {3: 'A', 4: 'B'}, 2: {11: {5:'B'}}}ネストされたキーを使って反復処理できないのはなぜですか?

私は'B'({5:'B'})にマップキーを取得することができるように辞書をループにしようとしています。しかし、このループが動作していないと、エラーを取得しています

'str' object has no attribute 'keys'

for key in mydict.keys(): 
    for subkey in mydict[key].keys(): 
     for sub_subkey in mydict[key][subkey].keys(): 
      print(sub_subkey) 

私はそれを手動で実行するときしかし、それだけで正常に動作します:

print(mydict[2][11].keys())私は5

+0

変更: 'mydict [キー]、[サブキー] .keys()'へ: 'mydict [key] [subkey]' - あなたはなぜそれを見ますか? – alfasin

+0

あなたの質問に答えられた場合は、サイトを支持し、[有益な回答を受け入れる](https://stackoverflow.com/help/someone-answers)をしてください。答えの横にある灰色のチェックを緑色にすることでそれを行います。それを習慣にする。 –

答えて

0
を取得

keyが1で、subkeyが3の場合、このエラーが発生します。たとえば、mydict[1][3].keys()には3番目のネストループがあり、文字列'A'にはkeys()メソッドがありません。

これらのループで何を達成しようとしているのかがすぐにわからないので、この問題を特定のケースで修正する最良の方法は不明です。 "'B', ({5:'B'})にマップされたキーを取得できるようにするには、辞書をループしています"は少し曖昧です。

+0

ああ、感謝します、ありがとう! mydict [key] [subkey] .keys()を:mydict [key] [subkey] 'に変更しましたが、' A、B、5'を出力します。 'A'と' B'はキーではないので、別の値のキーである値を出力するにはどうしたらいいですか? – eiobnrinb

+0

@eiobnrinb値が別の辞書であるかどうかをテストする再帰的なアルゴリズムが必要です。それがそうであれば、それはそれに再帰する。 – Barmar

0

問題はネストされた辞書のレベルが異なります。

mydictに2つの辞書があります。最初は辞書自体であり、もう1つは辞書です。

だからあなたのループは、第3レベルに基本的にダイビングですが、mydict[1]を取るとき、あなたはとてもmydict[1].keys()の呼び出しがOKで、それに辞書を持っていませんが、mydict[1][...]のように、より深く行くことあなたを与えるだろう「浅い」辞書を受け取ります要素ではなく、辞書ではないので、keys()メソッドを呼び出すことはできません。

あなたはすべてのキーをしたい場合は、特定の値にマップは、あなたが辞書の辞書によっていくつかの再帰的な検索を使用することができます。

def recursiveSearch(Dict, Value): 
    if Dict.__class__ != dict: 
     return 

    for key in Dict.keys(): 
     if(Dict[key].__class__ != dict): 
      if(Dict[key] == Value): 
       print(str(key) + ' : ' + str(Value)) 
     else: 
      recursiveSearch(Dict[key], Value) 
関連する問題