在networkx中按顺序获取源祖先

时间:2018-07-23 12:31:28

标签: python-3.x networkx

我正在使用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}如何依次获得它?有什么方法可以按顺序获取它吗?

1 个答案:

答案 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()定义新的递归方法,具体取决于您的方法)

编辑:更改了代码以使用您的示例