ale*_*lex 4 python tree duplicates python-3.x anytree
使用anytree我生成了这样的树:
A\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 B\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 C\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 D\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 F\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 B\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 C\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 E\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 G\nRun Code Online (Sandbox Code Playgroud)\n\n有没有办法删除所有重复的子级并将其变成下面的树(对所有可能级别的子级进行递归)?
\n\nA\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 B\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 C\n \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 D\n | \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 F\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 E\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 G\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:
\n\n我想要实现的是网站上所有链接的树。因此斜杠之间的所有内容都将成为子项:(.../child/...第二个斜杠是可选的)。以上只是我的问题的表述,但我希望它是清楚的。
这是我的节点生成:
\n\nroot = Node(\'A\')\nfor link in links:\n children = link.split(\'/\')\n cur_root = Node(children[0], parent=root)\n for one in children[1:]:\n cur_root = Node(one, parent=cur_root)\nRun Code Online (Sandbox Code Playgroud)\n
问题在于,每次添加新链接时,都会添加从根到最后一个子节点的新节点序列。但绝对有可能(并且合理)您已经部分添加了这样的路径。
快速修复可以是简单地检查子节点是否已添加到节点,并且仅检查是否已将其添加到节点。喜欢:
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
Run Code Online (Sandbox Code Playgroud)
因此,对于每个link in links,我们node最初设置为root。然后,对于每个节点,child我们将首先在节点中搜索具有相同名称的子节点。如果我们能找到这样的孩子(sub不是None),我们就构造一个新的孩子。无论该节点是否已经是子节点,我们都会移动到子节点,直到链接结束。
这将确保树中没有(部分)重复的路径,此外,它将减少它使用的内存量,因为将构造更少的对象(因此内存中存储的对象更少)。