在networkx(Python)中获取DiGraph的根(头)

min*_*ief 24 python directed-graph networkx

我试图networkx在项目中使用一些图形表示,我不知道如何做一些应该简单的事情.我创建了一个带有一堆节点和边的有向图,这样在这个图中只有一个根元素.现在,我想做的是从根开始,然后遍历每个元素的子元素并从中提取一些信息.我如何获得这个DiGraph的根元素?

所以它会是这样的:

#This is NOT real code, just pseudopython to convey the general intent of what I'd like to do

    root = myDiGraph.root()
    for child in root.children():
        iterateThroughChildren(child)

def iterateThroughChildren(parent):
    if parent.hasNoChildren(): return
    for child in parent.children():
        //do something
        //
        iterateThroughChildren(child)
Run Code Online (Sandbox Code Playgroud)

我没有在文档中看到任何提示检索DiGraph根的简单方法 - 我应该手动推断这个吗?:O我试着iter(myDiGraph)希望它会从根开始迭代,但顺序似乎是随机的......:\

将不胜感激,谢谢!

Ari*_*ric 48

如果通过"一个根元素"表示您的有向图是一个有根的树,那么根将是唯一具有零度的节点.

您可以在线性时间(节点数)中找到该节点:

In [1]: import networkx as nx

In [2]: G=nx.balanced_tree(2,3,create_using=nx.DiGraph()) # tree rooted at 0

In [3]: [n for n,d in G.in_degree() if d==0] 
Out[3]: [0]
Run Code Online (Sandbox Code Playgroud)

或者你可以使用拓扑排序(root是第一项):

In [4]: nx.topological_sort(G)
Out[4]: [0, 1, 3, 8, 7, 4, 9, 10, 2, 5, 11, 12, 6, 13, 14]
Run Code Online (Sandbox Code Playgroud)

或者,从给定(随机)节点开始并遵循前趋可能会更快,直到找到没有前驱的节点.

  • `in_ Degree()` 使用 `DiGraph` 对我有用。我正在使用“networkx”版本“2.2”。 (3认同)