使用此代码:
$ out_deg = g.degree()
$ to_remove=[n for n in out_deg if out_deg[n] ==1]
$ g.remove_nodes_from(to_remove)
我收到以下错误:
Error:
File "C:\Anaconda3\lib\site-packages\networkx\classes\reportviews.py", line 434, in __getitem__
nbrs = self._succ[n]
KeyError: (0, 0)
我也在尝试这段代码:
$ g.remove_nodes_from(n for n in g.degree() if g.degree[n] == 1)
我得到与上面相同的错误。
现在,使用此代码:
$ g.remove_nodes_from(n for n , degree in g.degree() if degree == 1)
我收到以下错误:
Error:
File "C:\Anaconda3\lib\site-packages\networkx\classes\reportviews.py", line 443, in __iter__
for n in self._nodes:
RuntimeError: dictionary changed size during iteration
请帮助
答案 0 :(得分:2)
您也可以尝试迭代使用g.remove_node()
函数。
graph = nx.Graph()
graph.add_edges_from([(1,2),(3,1),(5,6)])
nx.draw(graph, with_labels=True)
plt.show()
[graph.remove_node(k) for k,v in graph.degree().items() if v == 1]
nx.draw(graph, with_labels=True)
plt.show()
答案 1 :(得分:0)
我无法在networkx 1.x中检查确定,但对于2.0:g.degree()
不是dict。它是DegreeView
,它是特定于networkx的数据类型。
当你执行for n in g.degree()
时,n
成为元组对,其中元组中的第一个条目是节点,第二个条件是度。因此,当它尝试删除节点n
时,您确实希望它删除n[0]
---它没有节点n
。在您的情况下,它会在第一个尝试删除节点(0,0)
时死亡,节点0
表示具有度0
的节点g.remove_nodes_from(n for n , degree in g.degree() if degree == 1)
。
你几乎在g
的路径上,但问题是,当它循环通过时,事情会从g.degree()
中删除。然后,对to_remove=[n for n, degree in out_deg if out_deg[n] ==1]
g.remove_nodes_from(to_remove)
的下一次调用是在另一个图上运行,而python不乐意循环更改的事情。
所以试试
Signature: pck.load(file, *, fix_imports=True, encoding='ASCII', errors='strict')
Docstring:
Read and return an object from the pickle data stored in a file.
Signature: pck.dump(obj, file, protocol=None, *, fix_imports=True)
Docstring:
Write a pickled representation of obj to the open file object file.