gpt4 book ai didi

python - 不使用类/对象递归创建树层次结构

转载 作者:行者123 更新时间:2023-11-30 22:41:21 24 4
gpt4 key购买 nike

我在 Python 3 中创建树层次结构时遇到问题。我希望能够在不使用类的情况下完成此操作。

我需要开始的数据不按顺序排列,格式为['ID','Parent']:

data=[['E1', 'C1'],['C1', 'P1'],['P1', 'R1'],['E2', 'C2'],['C2', 'P2'],['P2', 'R1'],['C3', 'P2'],['E3', 'C4'],['C4', 'P3'],
['P3', 'R2'],['C5', 'P3'],['E4', 'C6'],['C6', 'P4'], ['P4', 'R2'],['E5', 'C7'],['C7', 'P5'],['P5', 'R3'],['E6', 'C9'],['C9', 'P6'],['P6', 'R3'],
['C8', 'P6'],['E7', 'C10'],['C10', 'P7'],['P7', 'R4'],['C11', 'P7'],['E8', 'C12'],['C12', 'P8'],['P8', 'R4']]

我想创建(树)字典变量而不使用类并最终得到如下结果:

Tree={'R1':{'P1':{},'P2':{}},'R2':{}} etc

或者

Tree={'R1':[{'P1':[],'P2':[]}],'R2':[]} etc

显然 R1 和 R2 的子级比这个多,但也许这就是树结构的样子?

最佳答案

您可以简单地迭代每个 childparent 元组,创建字典,将子元素和父元素的 id 映射到包含这些元素的子元素的列表。我们继续这样做,直到完成。

roots = set()
mapping = {}
for child,parent in data:
childitem = mapping.get(child,None)
if childitem is None:
childitem = {}
mapping[child] = childitem
else:
roots.discard(child)
parentitem = mapping.get(parent,None)
if parentitem is None:
mapping[parent] = {child:childitem}
roots.add(parent)
else:
parentitem[child] = childitem

现在我们已经做到了,roots 是一组树根的 id:因此对于每个这样的元素,我们知道没有 id 是父元素。对于roots中的每个id,我们可以简单地从mapping中获取,这是一个结构{'childid':child}的字典其中 childid 是 id(这里是 string),而 child 又是该形式的字典。

所以你可以像这样打印它们:

for root in roots:
print(mapping[root])

因此,在您的情况下,是:

tree = { id : mapping[id] for id in roots }

对于您的示例数据,它会生成:

>>> tree
{'R1': {'P1': {'C1': {'E1': {}}}, 'P2': {'C2': {'E2': {}}, 'C3': {}}}, 'R2': {'P4': {'C6': {'E4': {}}}, 'P3': {'C5': {}, 'C4': {'E3': {}}}}, 'R3': {'P6': {'C8': {}, 'C9': {'E6': {}}}, 'P5': {'C7': {'E5': {}}}}, 'R4': {'P8': {'C12': {'E8': {}}}, 'P7': {'C11': {}, 'C10': {'E7': {}}}}}

关于python - 不使用类/对象递归创建树层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42588346/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com