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
-条件有效。欢迎使用堆栈溢出。当回答一个有可接受答案的旧问题时(寻找绿色)✓) 确保您的答案添加了新的内容或有其他帮助。此外,虽然此代码段可能会解决问题,但它不会解释其回答问题的原因或方式。请,因为这有助于提高您的帖子的质量。请阅读以了解堆栈溢出,并参考。