文档说明图中的孤立顶点可以使用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应该给出类似的错误.那么文档中的那一行肯定是错的,不是吗?我完全没有了吗?我对python很新.
顺便说一句,networkx.isolates()返回的对象是一个生成器对象.
谢谢
我认为你是对的,提交文件补丁?
您也可以将生成器强制转换为列表以解决此问题:
G.remove_nodes_from(list(nx.isolates(G)))
但为什么你的解决方案工作?我不明白; 情况没有改变!
我将不得不看看他们的代码,但我的预感是生成器的懒惰正在根据异常消息对其进行处理.
转换为列表,集合在作为参数提供之前创建,因此在迭代时对对象没有副作用.
从@ Dyz的回答中可以看出,文档是正确的,您使用的是Nx 2.0.
这个集合创建在作为参数行为被提供之前是否适用于任何类型的演员(比如说dict或set)? -
好吧不完全(一套会工作)dict不会因为它想要一对物品.list而set当被称为像函数(和字典,但它再次需要对(元组的列表将工作))调用__iter__
生成__iter__器使它们成为可迭代的(+许多其他对象).生成器非常适合处理各种用例,例如,当您拥有大量项目并需要多次循环时,它可以节省运行时的复杂性.
然而,有一些细微差别,比如你遇到了什么,你必须了解一些正确使用的内部.