【问题标题】:pythonic way to delete edge attributespythonic删除边缘属性的方法
【发布时间】:2018-05-13 08:39:28
【问题描述】:

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

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

有没有更 Pythonic 的方式来做到这一点?

【问题讨论】:

    标签: networkx


    【解决方案1】:

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

    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]

    请参阅Removing multiple keys from a dictionary safely,了解如何从字典中删除多个键(d 就是这样)。从根本上说,一旦你得到d,你的问题就会减少。

    另外,如果您想清除所有属性,请注意,如果我们设置了data=True,那么graph.edges 也会返回带有属性的字典。清除这本词典。

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

    这是一个完整的例子

    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]
    > {}
    

    【讨论】:

    • 在我们的例子中,我们只需要删除部分属性——而不是全部。
    猜你喜欢
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多