[英]removing isolated vertices in networkx
文档说明图中的孤立顶点可以使用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
(和dict但它又需要对(元组列表将起作用))调用__iter__
生成器有__iter__
,这使得它们可迭代 (+许多其他对象)。 生成器非常适合处理各种用例,例如,当您拥有大量项目并需要多次循环时,它可以节省运行时的复杂性。
然而,有一些细微差别,比如你遇到了什么,你必须了解一些正确使用的内部。
在使用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
您混淆networkx-2.0
( isolates
返回迭代器)和networkx-1.10
文档( isolates
返回列表)。 您的代码在networkx-1.10
。 将list
应用于2.0中的isolates
将情况简化为1.10中存在的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.