获取嵌套列表中的项目级别

时间:2017-12-15 07:35:47

标签: python graph tree nested-lists

问题:

我有一些链接数据,我想在这张图片上构建一个像这样的结构:

my structure

并获得每个项目的级别,因为将来我会通过盯着树结构的最低级别进行一些计算。

预期结果:

我需要一个能够为每个级别提供项目的结构:

  • 等级0:A
  • 等级1:A = B,C,D
  • 2级:D = E,F,G
  • 3级:E = H,I,J,K

到目前为止我尝试过的内容:

我已尝试使用此递归代码来模拟行为,但我无法获取项目级别的项目。

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:这是一个模拟,但将来,我将不得不使用此代码处理大型数据集。 任何帮助将不胜感激

1 个答案:

答案 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']}]