文档说明图中的孤立顶点可以使用networkx.isolates( G )获得。它补充说,可以使用代码 G .remove_nodes_from(nx.isolates( G ))从图G中删除孤立的顶点。
但是我得到了运行时错误"字典在迭代期间改变了大小"当我运行代码。
错误报告: -
>>> 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()返回的对象是一个生成器对象。
谢谢
答案 0 :(得分:6)
我认为你是对的,提交文件补丁?
你也可以将生成器强制转换为列表来解决这个问题:
G.remove_nodes_from(list(nx.isolates(G)))
但为什么你的解决方案有效?我不明白;情况没有改变!
我必须查看他们的代码,但我的预感是基于Exception消息,生成器的懒惰正在对它起作用。
转换为列表,集合在作为参数提供之前创建,因此在迭代时对对象没有副作用。
从@ Dyz的回答中可以看出,文档是正确的,您使用的是Nx 2.0。
这个集合创建在作为参数行为提供之前是否适用于任何类型的演员(比如dict或set)? -
不完全(套装会起作用)dict赢了,因为它需要一对物品。 list
和set
被称为函数(和dict,但它需要成对(元组列表将起作用))调用__iter__
生成器有__iter__
,这使得它们iterables(+许多其他对象)。生成器非常适合处理各种用例,例如,当您拥有大量项目并需要多次循环时,它可以节省运行时的复杂性。
然而,有一些细微差别,例如你遇到的问题,你必须了解一些正确使用的内部结构。
答案 1 :(得分:4)
在使用2.X时,您正在查看1.X的文档。不幸的是,1.X文档的搜索引擎排名更高。
在networkx 2.X隔离区是一个生成器对象。
当前稳定的文档会将list()添加到示例代码中。
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中存在的情况。