我有一個嵌套字典,其中列表作爲值,格式如下,足夠大以至於遞歸失敗。使用一對多關係迭代嵌套字典
aDict = {"R": [
{"A": [
{"B": [
"C", "D"
]}
]},
{"E": [
{"F": [
{"G": ["H"]}, "I"
]}
]}
]}
我需要遍歷字典來添加和更新值;然而,我目前在迭代樹時遇到了問題,最終陷入了無限循環。除集合外,我無法在標準庫之外使用軟件包。 :(
我當前的代碼假設父的說法已經在嵌套的字典,而是孩子的說法是沒有。
def build_tree(aDict, parent, child, default=None):
""""""
stack = [iter(aDict.items())]
while stack:
for k, v in stack[-1]: # loop through keys and values
if isinstance(v, dict):
stack.append(iter(v.items())) # if v is type dict, append it to stack
break
elif isinstance(v, list):
for elem in v: # if v is list, loop through elements of list
if isinstance(v, dict):
stack.append(iter(v.items()))
elif parent == elem:
a_dict = {parent: [child]} # replace elem with a_dict
aDict[k].remove(parent)
aDict[k].append(a_dict)
return default
else:
pass
break
elif parent in k:
v.append(child) # add child to values list for parent
return default
elif parent in v: # assumes v is list type
a_dict = {parent: [child]} # replace v with a_dict
aDict[k].remove(parent)
aDict[k].append(a_dict)
return default
else:
stack.pop()
return default
,如果下面的代碼被註釋掉的功能不進入無限循環,但由於失敗列表中嵌套字典的存在。提前
elif isinstance(v, list):
for elem in v: # if v is list, loop through elements of list
if isinstance(v, dict):
stack.append(iter(v.items()))
elif parent == elem:
a_dict = {parent: [child]} # replace elem with a_dict
aDict[k].remove(parent)
aDict[k].append(a_dict)
return default
else:
pass
break
謝謝!
你想達到什麼目的?這似乎是一個漫長的方式來遍歷結構。 – zwer
我不反對。 1)我需要遍歷嵌套的字典 2)添加值以列出鍵是否已經存在 3)如果存在新的關係,例如Z有新的嵌套值,即{Z: [X,Y]} – IMLD
做什麼?只是「扁平化」結構(即讀取每個非字典元素)? – zwer