树没有重复的孩子

时间:2017-07-14 15:01:18

标签: python python-3.x tree duplicates anytree

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

1 个答案:

答案 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),我们就会构建一个新孩子。无论节点是否已经是孩子,我们都会转移到孩子,直到链接结束。

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