获取嵌套列表中的项目级别
Get level of items in a nested list
问题:
我有一些链接数据,我想在这张图片上构建一个像这样的结构:
并获取每个项目的级别,因为以后我会通过盯着我的树结构的最低级别进行一些计算。
预期结果:
我需要一个结构来为我提供每个级别的项目:
- 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:这是一个模拟,但将来我将不得不使用此代码处理大型数据集。
任何帮助将不胜感激
这就是我解决这个问题的方法。首先,我将从您的 dict_item
object.
生成树
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']}]}
然后,对树进行 breadth-first 搜索。每次我们点击具有 children 的元素时,我们将其附加到列表中:
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']}]
问题:
我有一些链接数据,我想在这张图片上构建一个像这样的结构:
并获取每个项目的级别,因为以后我会通过盯着我的树结构的最低级别进行一些计算。
预期结果:
我需要一个结构来为我提供每个级别的项目:
- 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:这是一个模拟,但将来我将不得不使用此代码处理大型数据集。 任何帮助将不胜感激
这就是我解决这个问题的方法。首先,我将从您的 dict_item
object.
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']}]}
然后,对树进行 breadth-first 搜索。每次我们点击具有 children 的元素时,我们将其附加到列表中:
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']}]