没有重复的树 children
Tree with no duplicate children
使用anytree
我生成了这样的树:
A
├── B
│ └── C
│ └── D
│ └── F
└── B
└── C
└── E
└── G
有没有办法删除所有重复的 children 并将其变成下面的树(在所有可能的级别递归 children)?
A
└── B
└── C
├── D
| └── F
└── E
└── G
编辑:
我想要实现的是网站上所有链接的树。所以斜杠之间的所有内容都会变成 child: .../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)
问题是,每次添加新的 link,您都会添加一个新的节点序列,从根节点到最后一个 child。但是您已经部分添加了这样的路径,这绝对有可能(并且有可能)。
一个快速修复可以是简单地检查 child 是否已经添加到节点,如果没有添加到节点。喜欢:
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
我们将首先在节点中搜索具有相同名称的 child 。如果我们能找到这样一个child(sub
不是None
),我们构造一个新的child。不管节点是否已经是child,我们移动到child直到link结束。
这将确保树中没有(部分)重复的路径,此外它将减少它使用的内存量,因为将构建更少的 objects(因此更少 objects存储在内存中)。
使用anytree
我生成了这样的树:
A
├── B
│ └── C
│ └── D
│ └── F
└── B
└── C
└── E
└── G
有没有办法删除所有重复的 children 并将其变成下面的树(在所有可能的级别递归 children)?
A
└── B
└── C
├── D
| └── F
└── E
└── G
编辑:
我想要实现的是网站上所有链接的树。所以斜杠之间的所有内容都会变成 child: .../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)
问题是,每次添加新的 link,您都会添加一个新的节点序列,从根节点到最后一个 child。但是您已经部分添加了这样的路径,这绝对有可能(并且有可能)。
一个快速修复可以是简单地检查 child 是否已经添加到节点,如果没有添加到节点。喜欢:
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
我们将首先在节点中搜索具有相同名称的 child 。如果我们能找到这样一个child(sub
不是None
),我们构造一个新的child。不管节点是否已经是child,我们移动到child直到link结束。
这将确保树中没有(部分)重复的路径,此外它将减少它使用的内存量,因为将构建更少的 objects(因此更少 objects存储在内存中)。