从连接的组件列表生成图形

Generate graph from a list of connected components

设置

让我们假设以下无向图:

import networkx as nx

G = nx.from_edgelist([(0, 3), (0, 1), (2, 5), (0, 3)])
G.add_nodes_from(range(7))

甚至添加 (1, 3) 边(这里无关紧要):

连接的组件是:

list(nx.connected_components(G))
# [{0, 1, 3}, {2, 5}, {4}, {6}]
问题

是否可以直接使用 networkx 从连通分量列表生成图 G?还是用简单的方法?

到目前为止我找到的唯一解决方案是生成连续的边或每组节点的所有组合并将其提供给 nx.from_edgelist, then to add the single nodes with add_nodes_from:

from itertools import pairwise, chain

l = [{0, 1, 3}, {2, 5}, {4}, {6}]

G = nx.from_edgelist(chain.from_iterable(pairwise(e) for e in l))
G.add_nodes_from(set.union(*l))

或所有边:

from itertools import combinations, chain

l = [{0, 1, 3}, {2, 5}, {4}, {6}]

G = nx.from_edgelist(chain.from_iterable(combinations(e, 2) for e in l))
G.add_nodes_from(set.union(*l))

itertools.pairwise 的替代方法是 networkx.path_graph

itertools.combinations 的替代方法是 networkx.complete_graph

这两个 networkx 函数 return 一个新图,而不是边列表,因此您可以将它们与 networkx.compose_all 组合。

另请注意 union_all and disjoint_union_all 作为 compose_all 的替代方法。

import networkx as nx

l = [{0, 1, 3}, {2, 5}, {4}, {6}]

G = nx.compose_all(map(nx.path_graph, l))

H = nx.compose_all(map(nx.complete_graph, l))

print(G.nodes, G.edges)
# [0, 1, 3, 2, 5, 4, 6] [(0, 1), (1, 3), (2, 5)]

print(H.nodes, H.edges)
# [0, 1, 3, 2, 5, 4, 6] [(0, 1), (0, 3), (1, 3), (2, 5)]

我实际上没有 运行 基准测试,但我怀疑创建多个图形并组合它们可能比创建边缘列表并将它们链接起来仅创建一个图形要慢。