我有一个嵌套字典,其中列表作为值,格式如下,足够大以至于递归失败。使用一对多关系迭代嵌套字典
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