如何在Python AnyTree中获取叶子节点到根节点的路径?
解决AnyTree获取节点到根节点路径的问题
方法1:利用Node内置的path属性
AnyTree的Node对象自带path属性,会返回从根节点到当前节点的节点对象列表。只需反转列表,再提取每个节点的名称即可实现需求:
from anytree import Node # 构建示例树结构 f = Node("f") b = Node("b", parent=f) d = Node("d", parent=b) e = Node("e", parent=d) # 获取路径 path_nodes = e.path # 结果:[Node('/f'), Node('/f/b'), Node('/f/b/d'), Node('/f/b/d/e')] path_names = [node.name for node in reversed(path_nodes)] print(path_names) # 输出:['e', 'd', 'b', 'f']
如果要封装成你想要的ShowMePath函数:
def ShowMePath(node, root=None): path_nodes = node.path # 若指定root,仅返回从node到root的路径(需确保root是node的祖先) if root: try: idx = path_nodes.index(root) path_nodes = path_nodes[idx:] except ValueError: return [] # root不是node祖先时返回空列表 return [n.name for n in reversed(path_nodes)] # 调用示例 print(ShowMePath(e, f)) # 输出:['e', 'd', 'b', 'f']
方法2:拆分节点的字符串表示
如果需要处理Node('/f/b/d/e')这类字符串输出,可直接提取路径部分拆分:
node_str = str(e) # 得到:"Node('/f/b/d/e')" # 提取引号内的路径,按/分割后过滤空字符串,再反转 path_parts = node_str.split("'")[1].split("/")[1:] # 结果:['f', 'b', 'd', 'e'] path_names = list(reversed(path_parts)) print(path_names) # 输出:['e', 'd', 'b', 'f']
补充说明
你提到的PostOrderIter这类迭代器用于遍历分支节点,和路径获取无关。path属性是AnyTree官方内置的路径获取方式,属于基础功能,可能之前查阅文档时未留意到。
内容的提问来源于stack exchange,提问作者RossGK
相关产品推荐
相关产品推荐

