用于删除节点的python中的networkx

时间:2017-12-11 03:57:53

标签: python networkx python-3.6

使用此代码:

$ 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

请帮助

2 个答案:

答案 0 :(得分:2)

迭代删除networkx节点

您也可以尝试迭代使用g.remove_node()函数。

首先设置示例图:

graph = nx.Graph()
graph.add_edges_from([(1,2),(3,1),(5,6)])
nx.draw(graph, with_labels=True)
plt.show()

Figure1

然后在条件

上迭代删除节点
[graph.remove_node(k) for k,v in graph.degree().items() if v == 1]
nx.draw(graph, with_labels=True)
plt.show()

Figure2

答案 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.