使用 NetworkX 的有向图,如何找到从某个节点开始的单个输入叶节点?

Pat*_* B. 3 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)
Run Code Online (Sandbox Code Playgroud)

可视化给出:

在此输入图像描述

我想找到仅具有从 开始的“子图”内的传入边的叶节点1

在我的示例中,它必须找到4但不是55是其子级,2其具有3第二个输入。

我认为它应该是有后继者和 in_ Degree 的东西,但我是 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)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在这里应该找到96。但不是10(因为3作为父母的2父母5

小智 6

以下代码比其他答案更紧凑并且运行速度更快。

roots = [v for v, d in G.in_degree() if d == 0]
leaves = [v for v, d in G.out_degree() if d == 0]
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到堆栈溢出。当回答具有已接受答案的旧问题时(寻找绿色✓),请确保您的答案添加了新内容或有其他帮助。此外,虽然此代码片段可以解决问题,但它没有解释为什么或如何回答问题。请[包括对您的代码的解释](https://meta.stackoverflow.com/q/392712/5698098),因为这有助于提高帖子的质量。请通过[游览](https://stackoverflow.com/tour)了解 Stack Overflow,并参阅[贡献指南](https://stackoverflow.com/help/how-to-answer)。 (2认同)