4

使用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)
4

1 回答 1

4

问题是每次添加新链接时,都会添加从根节点到最后一个子节点的新节点序列。但是您已经部分添加了这样的路径绝对是可能的(并且是合理的)。

一个快速修复可以是简单地检查一个子节点是否已经添加到节点中,并且仅当没有将它添加到节点时。喜欢:

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),我们就构造一个新的孩子。不管节点是否已经是孩子,我们都会移动到孩子直到链接结束。

这将确保树中没有(部分)重复的路径,此外它将减少它使用的内存量,因为将构造更少的对象(因此更少的对象存储在内存中)。

于 2017-07-14T15:18:35.147 回答