rya*_*nhz 2 python tree list anytree
我当前正在使用anytree来生成搜索树,如何以列表格式获取从根节点开始的所有可能的分支
from anytree import Node, RenderTree, AsciiStyle
f = Node("f")
b = Node("b", parent=f)
a = Node("a", parent=b)
d = Node("d", parent=b)
c = Node("c", parent=d)
e = Node("e", parent=d)
g = Node("g", parent=f)
i = Node("i", parent=g)
h = Node("h", parent=i)
print(RenderTree(f, style=AsciiStyle()).by_attr())
Run Code Online (Sandbox Code Playgroud)
当前树:
f
|-- b
| |-- a
| +-- d
| |-- c
| +-- e
+-- g
+-- i
+-- h
Run Code Online (Sandbox Code Playgroud)
想要的输出(treeBranch):
[[f、b、a]、[f、b、d、c]、[f、b、d、e]、[f、g、i、h]]
我不确定是否有更好的方法来做到这一点,欢迎任何建议。
我想使用此列表来检查树中是否存在来自用户的新路径,例如:
newPath = [f, b]
for branch in treeBranch:
if newPath in branch:
return true
else:
// add new path to tree
Run Code Online (Sandbox Code Playgroud)
您希望每个叶节点都有根路径。只需使用带有 a 的PreOrderIterfilter_即可检索叶节点:
print(list(PreOrderIter(f, filter_=lambda node: node.is_leaf)))
[a, c, e, h]
Run Code Online (Sandbox Code Playgroud)
然后访问每个节点上的路径属性:
print([list(leaf.path) for leaf in PreOrderIter(f, filter_=lambda node: node.is_leaf)])
[[f,b,a], [f,b,d,c], [f,b,d,e], [f,g,i,h]]
Run Code Online (Sandbox Code Playgroud)
如果您想要从树中的任何节点到叶节点的路径:
def allpaths(start):
skip = len(start.path) - 1
return [leaf.path[skip:] for leaf in PreOrderIter(start, filter_=lambda node: node.is_leaf)]
print(allpaths(b))
[(b, a), (b, d, c), (b, d, e)]
Run Code Online (Sandbox Code Playgroud)
请注意,还有一个Walker,它提供从任何节点到另一个节点的路径。
| 归档时间: |
|
| 查看次数: |
3316 次 |
| 最近记录: |