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(使用前将#替换为@)