在径向(树)networkx图中查找末端节点(叶节点)

ato*_*3ls 5 python graph-theory networkx

给出下面的图表,有没有一种方便的方法来获得终端节点?

端节点是指那些具有一个连接边的节点.我认为这些有时被称为叶节点.

G=nx.DiGraph()
fromnodes=[0,1,1,1,1,1,2,3,4,5,5,5,7,8,9,10]
tonodes=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
for x,y in zip(fromnodes,tonodes):
    G.add_edge(x,y)
G.add_node(17)     # isolated node
nx.draw_shell(G)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在这个例子中,它将是 [6,11,12,13,14,15,16]

Joe*_*oel 14

为了确保定义清晰:我假设您正在寻找具有0度和0度的所有节点.这是我的计算结果.

我正在编辑原始答案,因为networkx 2.0没有nodes_iter().有关将1.x代码转换为2.0代码的信息,请参阅networkx 迁移指南.

对于networkx 2.0

如果你想要一个清单

[x for x in G.nodes() if G.out_degree(x)==0 and G.in_degree(x)==1]
Run Code Online (Sandbox Code Playgroud)

如果你想要一台发电机

(x for x in G.nodes() if G.out_degree(x)==0 and G.in_degree(x)==1)
Run Code Online (Sandbox Code Playgroud)

这也适用于networkx 1.x,但效率较低,因为G.nodes()在1.x中创建了一个列表.

对于networkx 1.x

如果你想要一个清单

[x for x in G.nodes_iter() if G.out_degree(x)==0 and G.in_degree(x)==1]
Run Code Online (Sandbox Code Playgroud)

如果你想要一台发电机

(x for x in G.nodes_iter() if G.out_degree(x)==0 and G.in_degree(x)==1)
Run Code Online (Sandbox Code Playgroud)

并且只是一个注释 - 如果您G在使用生成器时进行修改,则行为不太可能是您想要的.

  • 对于更通用的叶节点定义,我建议 in_degree > 1。我们希望节点连接到图形,但叶节点可能有多个父节点。 (2认同)