问题:
我有一些链接数据,我想在这张图片上构建一个像这样的结构:
并获得每个项目的级别,因为将来我会通过盯着树结构的最低级别进行一些计算。
预期结果:
我需要一个能够为每个级别提供项目的结构:
到目前为止我尝试过的内容:
我已尝试使用此递归代码来模拟行为,但我无法获取项目级别的项目。
dict_item = {"A": ["B","C","D"], "D": ["E","F","G"], "E":["H","I","J"]}
def build_bom(product):
if not dict_item.get(product):
return product
else :
return [build_bom(x) for x in dict_item.get(product)]
print(build_bom("A"))
我的输出是一个嵌套列表,如下所示:
['B', 'C', [['H', 'I', 'J'], 'F', 'G']]
我的问题:
我不确定这是否是解决问题的最佳方法。 以及如何获得所需的输出? 这是所需的输出:
[ {"parent_E":["H", "I", "J"]},
{"parent_D": ["E", "F", "G"]},
{"parent_A"} :["D","C","B"]},
]
字典列表(其中键是父项,值是子项),列表中的第一个元素是我的结构的最低级别,最后一个元素是最高元素。
PS:这是一个模拟,但将来,我将不得不使用此代码处理大型数据集。 任何帮助将不胜感激
答案 0 :(得分:1)
这就是我将如何解决这个问题。首先,我将从您的dict_item
对象生成树。
dict_item = {"A": ["B","C","D"], "D": ["E","F","G"], "E":["H","I","J"]}
def build_tree(x):
if x in dict_item:
return {x: [build_tree(v) for v in dict_item[x]]}
else:
return x
tree = build_tree("A")
print(tree)
>>> {'A': ['B', 'C', {'D': [{'E': ['H', 'I', 'J']}, 'F', 'G']}]}
然后,在树上进行广度优先搜索。每次我们点击一个有子节点的元素时,我们都会将它附加到一个列表中:
results = []
queue = [tree]
while queue:
x = queue.pop(0)
if isinstance(x, dict):
parent, children = list(x.items())[0]
results.append({'parent_' + parent: dict_item[parent]})
for child in children:
queue.append(child)
print(results)
>>> [{'parent_A': ['B', 'C', 'D']}, {'parent_D': ['E', 'F', 'G']}, {'parent_E': ['H', 'I', 'J']}]
然后我们现在需要做的就是反转清单:
print list(reversed(results))
>>> [{'parent_E': ['H', 'I', 'J']}, {'parent_D': ['E', 'F', 'G']}, {'parent_A': ['B', 'C', 'D']}]