使用anytree
我制作了这样的树:
A
├── B
│ └── C
│ └── D
│ └── F
└── B
└── C
└── E
└── G
有没有办法删除所有重复的子项并将其转换为下面的树(对所有可能级别的子项递归)?
A
└── B
└── C
├── D
| └── F
└── E
└── G
修改
我想要实现的是网站上所有链接的树。因此,斜杠之间的所有内容都将成为子项:.../child/...
(第二个斜杠是可选的)。以上只是我问题的一个表示,但我希望它清楚。
这是我的节点生成:
root = Node('A')
for link in links:
children = link.split('/')
cur_root = Node(children[0], parent=root)
for one in children[1:]:
cur_root = Node(one, parent=cur_root)
答案 0 :(得分:2)
问题在于,每次添加新链接时,都会从根添加新的节点序列到最后一个子节点。但是,你已经部分地添加了这样一条路径,这绝对是可能的(也是合理的)。
快速修复可以简单地检查子节点是否已添加到节点,并且仅在未将其添加到节点时进行。像:
root = Node('A')
for link in links:
node = root
for child in link.split('/'):
sub = next((c for c in node.children if c.name == child),None)
if sub is None:
sub = Node(child,parent=node)
node = sub
因此,对于每个link in links
,我们最初将node
设置为root
。然后,对于每个child
,我们将首先在节点中搜索具有相同名称的子节点。如果我们能找到这样一个孩子(sub
不是None
),我们就会构建一个新孩子。无论节点是否已经是孩子,我们都会转移到孩子,直到链接结束。
这将确保树中没有(部分)重复的路径,而且它将减少它使用的内存量,因为将构造更少的对象(因此更少的对象存储在内存中)。