没有重复子项的树

2024-03-22

Using anytree https://pypi.python.org/pypi/anytree我制作了这样的树:

A
├── B
│   └── C
│       └── D
│           └── F
└── B
    └── C
        └── E
            └── G

有没有办法删除所有重复的子级并将其变成下面的树(对所有可能级别的子级进行递归)?

A
└── B
    └── C
        ├── D
        |   └── F
        └── E
            └── G

Edit:

我想要实现的是网站上所有链接的树。所以斜杠之间的所有内容都将成为子项:.../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)

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

快速修复可以是简单地检查子节点是否已添加到节点,并且仅检查是否已将其添加到节点。喜欢:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有重复子项的树 的相关文章

随机推荐