删除networkx

时间:2018-02-16 05:28:32

标签: python networkx

文档说明图中的孤立顶点可以使用networkx.isolates( G )获得。它补充说,可以使用代码 G .remove_nodes_from(nx.isolates( G ))从图G中删除孤立的顶点。

https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.algorithms.isolate.isolates.html

screenshot of documentation(url above)

但是我得到了运行时错误"字典在迭代期间改变了大小"当我运行代码。

错误报告: -
>>> G.remove_nodes_from(nx.isolates(G)) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/classes/graph.py", line 617, in remove_nodes_from for n in nodes: File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/algorithms/isolate.py", line 94, in <genexpr> return (n for n, d in G.degree() if d == 0) File "/home/iiitdm/anaconda2/lib/python2.7/site-packages/networkx/classes/reportviews.py", line 443, in __iter__ for n in self._nodes: RuntimeError: dictionary changed size during iteration

这是可以理解的并且是可以理解的,因为(我认为)使用函数isolates()创建的生成器对象随G一起变化,因此在迭代时更改图G&#39;应该给出类似的错误。那么文档中的那一行肯定是错的,不是吗?我完全没有了吗?我对python很新。

顺便说一句,networkx.isolates()返回的对象是一个生成器对象。

谢谢

3 个答案:

答案 0 :(得分:6)

我认为你是对的,提交文件补丁?

你也可以将生成器强制转换为列表来解决这个问题:

G.remove_nodes_from(list(nx.isolates(G)))

  

但为什么你的解决方案有效?我不明白;情况没有改变!

我必须查看他们的代码,但我的预感是基于Exception消息,生成器的懒惰正在对它起作用。

转换为列表,集合在作为参数提供之前创建,因此在迭代时对对象没有副作用。

从@ Dyz的回答中可以看出,文档是正确的,您使用的是Nx 2.0。

https://networkx.github.io/documentation/networkx-2.0/reference/algorithms/generated/networkx.algorithms.isolate.isolates.html

  

这个集合创建在作为参数行为提供之前是否适用于任何类型的演员(比如dict或set)? -

不完全(套装会起作用)dict赢了,因为它需要一对物品。 listset被称为函数(和dict,但它需要成对(元组列表将起作用))调用__iter__

生成器有__iter__,这使得它们iterables(+许多其他对象)。生成器非常适合处理各种用例,例如,当您拥有大量项目并需要多次循环时,它可以节省运行时的复杂性。

然而,有一些细微差别,例如你遇到的问题,你必须了解一些正确使用的内部结构。

答案 1 :(得分:4)

在使用2.X时,您正在查看1.X的文档。不幸的是,1.X文档的搜索引擎排名更高。

在networkx 2.X隔离区是一个生成器对象。

当前稳定的文档会将list()添加到示例代码中。

https://networkx.github.io/documentation/stable/reference/algorithms/generated/networkx.algorithms.isolate.isolates.html

In [107]: nx.isolates(G)
Out[107]: <generator object isolates.<locals>.<genexpr> at 0x7fa499cd8e60>

如果您也期望1.X行为,迁移指南可能会有所帮助。

https://networkx.github.io/documentation/stable/release/migration_guide_from_1.x_to_2.0.html

答案 2 :(得分:3)

您混淆networkx-2.0(其中isolates返回迭代器)和networkx-1.10的文档(其中isolates返回列表)。您的代码在networkx-1.10中可以正常运行。在2.0中将list应用于isolates会将情况降低到1.10中存在的情况。