关于networkx:删除边缘属性的pythonic方法

pythonic way to delete edge attributes

为了从networkx图中删除属性,我有以下代码:

1
2
3
for (n1,n2) in graph.edges(data=False):  
    for att in att_list:  
        graph[n1][n2].pop(att, None)

有没有比这更像Python的方法?


如果您只想删除一些列表中的属性,比如att_list

1
2
3
for n1, n2, d in graph.edges(data=True):
    for att in att_list:
        d.pop(att, None)

或者你可以用if att in d: del d[att]替换最后一行,如果pop返回一些你不使用的东西让你感到不安。与您的代码相比,改进之处在于,通过使用data=True,我可以立即获得d,而不必稍后引用graph[n1][n1]

请参阅安全地从字典中删除多个键,了解如何从字典中删除多个键(这就是d的含义)。从根本上说,一旦你得到了d,你的问题就会减少。

或者,如果要清除所有属性,请注意,如果我们设置了data=True,那么graph.edges也会返回具有这些属性的字典。清除这本词典。

1
2
for (n1, n2, d) in graph.edges(data=True):
    d.clear()

这是一个完整的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
import networkx as nx
G=nx.Graph()
G.add_edge(1,2,weight=2)
G.edge[1][2]
> {'weight': 5}

for (n1, n2, d) in G.edges(data=True):
    d.clear()
G.edge[1][2]
> {}
#just to check the edge in the opposite order
G.edge[2][1]
> {}