2017-02-12 79 views
1

我有一個嵌套字典和鍵值的字典。Python3 - 我們可以使用for循環遍歷一個字典的字典嗎?

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'}} 

,但我得到類型錯誤:字符串指標必須是第二打印整數。

在此先感謝! *我編輯替換n與dicta;我第一次複製並粘貼它是錯誤的。

+2

看起來你不應該在這裏迭代*。你可能只想'dicta ['key2'] ['key3']'。 – user2357112

回答

1

一般來說,沒有。字典可以任意遞歸地深入,並且沒有什麼好的方法只用for循環遍歷它們。 (你可以使用列表實現自己的堆棧和模擬遞歸,但是這不是「好」。)

有一個在this question.

遍歷字典一些遞歸代碼(算上深度)在特定的,肯定的。知道了結構提前,你可以使用for循環的正確數量:

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

您可以使用遞歸潛入給出的字典和打印鍵和鍵值。

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()返回字典中的項目有新的觀點((鍵,值)對)的更多細節。 所以你可以試試這個:

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

isinstance(v,dict)返回true,如果對象參數是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

歡迎來到Stack Overflow!儘管您可能已經解決了此用戶的問題,但僅有代碼的答案對於未來出現此問題的用戶來說並不是很有幫助。請編輯您的答案,以解釋爲什麼您的代碼可以解決原始問題。 –