根据networkx文档,connected_component_subgraphs(G)返回所有组件的排序列表。因此,第一个应该是最大的组件。
但是,当我尝试使用文档页面上的示例代码获取图G的最大成分时
G=nx.path_graph(4) G.add_edge(5,6) H=nx.connected_component_subgraphs(G)[0]
我懂了
TypeError: 'generator' object has no attribute '__getitem__'
它曾经可以在其他装有networkx早期版本的计算机上使用(我认为是1.7,不是100%肯定)
现在,我正在使用另一台计算机,其中包含python 2.7.7和networkx 1.9。是版本问题吗?
我自己编写了一个带有几行代码的小函数,以查找最大的组件,只是想知道为什么会出现此错误。
顺便说一句,我可以通过将生成器对象转换为列表来获取组件。
components = [comp for comp in nx.connected_components(G)]
但是该列表未按文档中所述按组件大小排序。
例:
G = nx.Graph() G.add_edges_from([(1,2),(1,3),(4,5)]) G.add_nodes_from(range(6,20)) components = [comp for comp in nx.connected_components(G)] component_size = [len(comp) for comp in components] print G.number_of_nodes(), G.number_of_edges(), component_size G = nx.Graph() G.add_edges_from([(1000,2000),(1000,3000),(4000,5000)]) G.add_nodes_from(range(6,20)) components = [comp for comp in nx.connected_components(G)] component_size = [len(comp) for comp in components] print G.number_of_nodes(), G.number_of_edges(), component_size
输出:
19 3 [3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 19 3 [2, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
看起来当节点名称为大数并且有一堆单个节点时,返回的子图未正确排序
networkx-1.9文档在此处http://networkx.github.io/documentation/networkx-1.9/reference/Generated/networkx.algorithms.components.connected.connected_components.html#networkx.algorithms.components.connected.connected_components
接口已更改为返回生成器(如您所知)。文档中的示例显示了如何执行您要求的操作。
生成已连接组件的排序列表,从大到大。
>> G = nx.path_graph(4) >>> G.add_path([10, 11, 12]) >>> sorted(nx.connected_components(G), key = len, reverse=True) [[0, 1, 2, 3], [10, 11, 12]]
要么
>>> sorted(nx.connected_component_subgraphs(G), key = len, reverse=True)