Python 使用NetworkX';有向图,如何从某个节点开始查找单个输入叶节点?
以下图为例:Python 使用NetworkX';有向图,如何从某个节点开始查找单个输入叶节点?,python,networkx,Python,Networkx,以下图为例: G = nx.DiGraph() G.add_edge(1,2) G.add_edge(3,2) G.add_edge(1,4) G.add_edge(2,5) 其中可视化给出: 我想从1开始在“子图”中查找只具有传入边的叶节点 在我的示例中,它必须查找4,而不是55是2的子项,它有3作为第二个输入 我认为这应该是有继承人和学位的东西,但我是NetworkX的新手,很难找到正确的算法 另一个例子: G = nx.DiGraph() G.add_edge(1,2) G.add
G = nx.DiGraph()
G.add_edge(1,2)
G.add_edge(3,2)
G.add_edge(1,4)
G.add_edge(2,5)
其中可视化给出:
我想从1
开始在“子图”中查找只具有传入边的叶节点
在我的示例中,它必须查找4
,而不是5
5
是2
的子项,它有3
作为第二个输入
我认为这应该是有继承人和学位的东西,但我是NetworkX的新手,很难找到正确的算法
另一个例子:
G = nx.DiGraph()
G.add_edge(1,2)
G.add_edge(3,2)
G.add_edge(1,4)
G.add_edge(2,5)
G.add_edge(4,6)
G.add_edge(1,7)
G.add_edge(7,6)
G.add_edge(1,8)
G.add_edge(8,7)
G.add_edge(8,6)
G.add_edge(4,9)
G.add_edge(4,10)
G.add_edge(5,10)
在这里可以找到
9
和6
。但不是10
(因为3
是2
的父级5
,让我们尝试一下以下逻辑:
def find_leafnodes(G):
leafnode = []
for i in G.nodes:
head = []
if nx.descendants(G, i) == set(): #find all leaf nodes
for a in nx.ancestors(G, i): #get all ancestors for leaf node
if nx.ancestors(G, a) == set(): #Determine if ancestor is a head node
head.append(a)
if len(head) == 1: #if this leaf had only one head then append to leafnode
leafnode.append(i)
return leafnode
输入:
G = nx.DiGraph()
G.add_edge(1,2)
G.add_edge(3,2)
G.add_edge(1,4)
G.add_edge(2,5)
find_leafnodes(G)
# [4]
G = nx.DiGraph()
G.add_edge(1,2)
G.add_edge(3,2)
G.add_edge(1,4)
G.add_edge(2,5)
G.add_edge(4,6)
G.add_edge(1,7)
G.add_edge(7,6)
G.add_edge(1,8)
G.add_edge(8,7)
G.add_edge(8,6)
G.add_edge(4,9)
G.add_edge(4,10)
G.add_edge(5,10)
find_leafnodes(G)
# [6, 9]
试试看:
roots = [v for v, d in G.in_degree() if d == 0]
leaves = [v for v, d in G.out_degree() if d == 0]
如果您创建了一个示例有向图,这样我们就可以创建可复制的代码,我会有所帮助。@ScottBoston我更新了我的问题。现在这是一个有趣的问题。我投票并标记为我的最爱。我想我们必须遍历后代节点,看看它是否会分支到另一个头部节点。感谢您迄今为止的帮助,它是有效的。但是
find_leavenodes()
缺少“起始节点”参数。想象一下添加edge[3,11]
。如果我正在寻找1
的纯基因后代,我不想找到11
。我在If len(head)中添加并根==头[0]
==1
-条件有效。欢迎使用堆栈溢出。当回答一个有可接受答案的旧问题时(寻找绿色)✓) 确保您的答案添加了新的内容或有其他帮助。此外,虽然此代码段可能会解决问题,但它不会解释其回答问题的原因或方式。请,因为这有助于提高您的帖子的质量。请阅读以了解堆栈溢出,并参考。