Python NetworkX从作为根的节点在有向图中查找子图

Python NetworkX从作为根的节点在有向图中查找子图,python,graph,networkx,directed-graph,Python,Graph,Networkx,Directed Graph,我正在编写一个代码,从有向图中提取信息。这个图也有循环。比如说, A->B->C->D A->E->F->A B->F->G 从这个图中,我想创建一个子图或节点列表,其中输入为任意节点,输出为输入节点为根的图,或包含输入节点的所有子节点(直到图的末尾)的节点列表 比如在上面的例子中, 1.如果输入节点是C,则输出将是D 2.如果输入节点是B,则输出节点将是C、D、F、G、A(因为存在一个循环,使得A到B是双向的) 3.如果输入为G,则输出为空或n

我正在编写一个代码,从有向图中提取信息。这个图也有循环。比如说,

A->B->C->D
A->E->F->A
B->F->G
从这个图中,我想创建一个子图或节点列表,其中输入为任意节点,输出为输入节点为根的图,或包含输入节点的所有子节点(直到图的末尾)的节点列表

比如在上面的例子中, 1.如果输入节点是C,则输出将是D 2.如果输入节点是B,则输出节点将是C、D、F、G、A(因为存在一个循环,使得A到B是双向的) 3.如果输入为G,则输出为空或null

python networkx中有什么功能可以用来解决这个问题吗


或者,是否有其他工具可以帮助我解决此问题?

您需要的是函数。以下是一个基于您的数据的小演示:

import networkx as nx

g = nx.DiGraph()

g.add_edge('A', 'B')
g.add_edge('B', 'C')
g.add_edge('C', 'D')

g.add_edge('A', 'E')
g.add_edge('E', 'F')
g.add_edge('F', 'A')

g.add_edge('B', 'F')
g.add_edge('F', 'G')

print('A:', list(nx.dfs_preorder_nodes(g, 'A')))
print('B:', list(nx.dfs_preorder_nodes(g, 'B')))
print('G:', list(nx.dfs_preorder_nodes(g, 'G')))
输出:

A: ['A', 'B', 'C', 'D', 'F', 'G', 'E']
B: ['B', 'C', 'D', 'F', 'A', 'E', 'G']
G: ['G']
输出包括起始节点。因此,如果不需要它,只需从列表中删除第一个元素

请注意,
dfs\u preorder\u nodes()
返回一个生成器对象。这就是为什么我调用了
list()
,以获得可用的输出。

nx.ego\u graph()
正是您所描述的。使用@Hai Vu给出的示例:

g = nx.DiGraph()

g.add_edge('A', 'B')
g.add_edge('B', 'C')
g.add_edge('C', 'D')
g.add_edge('A', 'E')
g.add_edge('E', 'F')
g.add_edge('F', 'A')
g.add_edge('B', 'F')
g.add_edge('F', 'G')

a = nx.ego_graph(g, 'A', radius=100)
a.node
#out: NodeView(('A', 'B', 'C', 'D', 'E', 'F', 'G'))

list(nx.ego_graph(g, 'G', radius=100).node)
#out: ['G']

radius
如果要获取树中的所有节点直到叶子,则半径应为任意大的数字。

如果输入为B,输出如何为C、D、F、G、A?难道不应该只有C和D吗?@Swailem95。。B依赖于C和D(第1行)。B依赖于F和G(第三行),F依赖于A(第二行)。它实际上应该是C,D,F,G,A,E。。我错过了。非常感谢!!我尝试了bfs_tree()和dfs_tree()函数,但这一个看起来更好!