我正在使用networkx 2.1版生成图形。
g = nx.DiGraph()
g.add_nodes_from([1, 2, 3, 4, 5, 6])
g.add_edges_from([(1, 2), (2, 4), (4, 5), (1, 3), (3, 6)])
如果我用nx.ancestors(g, 5)
检查node = 5的祖先,它将返回集合{1, 2, 4}
有时不是按顺序返回,例如{1, 4, 2}
如何依次获得它?有什么方法可以按顺序获取它吗?
答案 0 :(得分:3)
您的DiGraph就像一棵树(又称每个节点最多可以有1个父节点,而没有父节点的唯一节点是根节点。)
如果实际图是一棵树,那么使所有祖先井然有序的最简单方法是使用shortest_path()
函数。
import networkx as nx
g = nx.DiGraph()
g.add_nodes_from([1, 2, 3, 4, 5, 6])
g.add_edges_from([(1, 2), (2, 4), (4, 5), (1, 3), (3, 6)])
nx.shortest_path(g, source=1, target=5)
# return [1,2,4,5] which is the list of all nodes from root 1 to my node 5
如果您不知道您的 树 的根,那么一种简单的查找方法是寻找唯一一个in_degree
等于0.类似:
def get_root(g):
for node, indegree in g.in_degree():
if indegree == 0:
# if you'r graph is a tree you only have one root so you don't need to check every node, once you find it it's done
return node
或者只是拓扑中的第一个元素:next(nx.topological_sort(g))
如果图形不是树,则可能需要使用predecessors()
(或successors()
定义新的递归方法,具体取决于您的方法)
编辑:更改了代码以使用您的示例