Networkx提取某些维度的连通组件子图表:错误计数

时间:2016-11-22 17:28:18

标签: python list networkx subgraph

我已经通过这种方式提取了一个图G的所有连通分量的列表作为子图的列表:

sg = list(nx.connected_component_subgraphs(G))

然后我做了一些计数:

n_conn_comp = nx.number_connected_components(G) # >>> 172305
n_isolated_nodes = len(nx.isolates(G)) # >>> 152403
n_subgraf_dimensionMoreThan1 = n_conn-comp - n_isolated_nodes # >>> 19902
len(sg) # >>> 172305

直到这里一切都好。 然后我的任务是提取维度大于1(至少2)的连通组件列表作为子图列表。 因为在NetworkX中没有这样的库命令(或者我错了吗?!),我试过这样做:

for elem in sg:
    if len(elem) == 1:
        sg.remove(elem)

此代码不会出错。我预计现在len(sg)是= n_subgraf_dimensionMoreThan1,所以= 19902.所以我检查了这个:

len(sg)

但结果是:

>>> 91620

远远超过预期(19902) 我真的不知道出了什么问题。我也尝试使用相同的代码将len 1的字符串删除到不同len的字符串列表中,并且它工作正常。

5月份的子图列表会以不同的方式进行..

有什么建议吗?!非常感谢

2 个答案:

答案 0 :(得分:1)

我相信它是因为您要从正在迭代的同一列表中删除项目。例如:

>>> sg = range(20)
>>> for i in sg:
        sg.remove(i)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

解决方案是制作一个sg副本进行迭代,另一个副本调用你的.remove()方法。

答案 1 :(得分:0)

我终于解决了这个问题:(列表理解)

sg_MoreThan1 = [el for el in sg_notdeg if len(el)!=1]

事实上:

len(sg_MoreThan1)
>>> 19902

非常感谢。