首先,这是一个最小的可重现示例:
from anytree import Node, render
a = Node(name="A", parent=None)
b = Node(name="B", parent=a)
c = Node(name="C", parent=b)
d = Node(name="D", parent=c)
e = Node(name="E", parent=a)
c2 = Node(name="C", parent=e)
d2 = Node(name="D", parent=c)
root = a
print(render.RenderTree(root).by_attr())
A
├── B
│ └── C
│ ├── D
│ └── D
└── E
└── C
关于您的问题,您必须记住已经创建了哪些节点,如下所示:
from anytree import Node, render
already_seen = {}
def create_node(name, parentname):
if name in already_seen:
if already_seen[name].parent.name == parentname:
# edge already created
child = already_seen[name]
return child
else:
# the node already exists, but has a new parent
parent = already_seen[parentname]
child = already_seen[name]
parent.children = parent.children + (child,) # add to parent's children
return child
else: # name never seen
if parentname in already_seen:
# new child for a known parent
parent = already_seen[parentname]
child = Node(name, parent=parent)
already_seen[name] = child
return child
elif parentname is None:
# a root
root = Node(name, None)
already_seen[name] = root
return root
else:
raise ValueError("unknown parent name " + repr(parentname))
a = create_node(name="A", parentname=None)
b = create_node(name="B", parentname="A")
c = create_node(name="C", parentname="B")
d = create_node(name="D", parentname="C")
e = create_node(name="E", parentname="A")
c2 = create_node(name="C", parentname="E")
d2 = create_node(name="D", parentname="C")
root = a
print(render.RenderTree(root).by_attr())
A
├── B
└── E
└── C
└── D
但是你还有另一个问题:你的图依赖不是一棵树:它是一个(有向的)图!
但是您使用的库,anytree顾名思义,只能对树进行建模。所以你不能让你的C节点同时拥有B和E作为父节点。除了使用另一个可以支持(有向)图的库之外,没有其他解决方案。