如何用更Pythonic的方式删除NetworkX图的边属性?
当然有啦!你的代码能正常工作,但确实可以写得更简洁、更符合Python风格。这里有几种优化方案:
利用
edges(data=True)直接访问属性字典
NetworkX的edges(data=True)可以直接返回每条边的属性字典,不用再通过graph[n1][n2]间接访问,代码会更直观:for n1, n2, attr_dict in graph.edges(data=True): for att in att_list: attr_dict.pop(att, None)要是想再简化内层循环,还能用列表推导式替代:
for n1, n2, attr_dict in graph.edges(data=True): _ = [attr_dict.pop(att, None) for att in att_list]这里用
_接收列表推导式的返回值,是Python里常见的“我不需要这个返回值”的写法。批量重建属性字典(适合移除大量属性的场景)
如果att_list里包含很多要移除的属性,直接重建属性字典会更高效,也更易读:for n1, n2, attr_dict in graph.edges(data=True): graph[n1][n2] = {k: v for k, v in attr_dict.items() if k not in att_list}这种方式通过字典推导式只保留不需要移除的属性,一次性替换掉原有的属性字典,逻辑更清晰。
简化原有的嵌套循环写法
如果你不想改动遍历边的方式,也可以把内层循环改成生成器表达式,用all()触发执行(因为生成器是惰性的,需要调用它才会执行):for n1, n2 in graph.edges(data=False): all(graph[n1][n2].pop(att, None) for att in att_list)这种写法把嵌套循环压缩成了一行,保持功能不变的同时更紧凑。
这些写法都遵循了Python的“简洁、直观”原则,比原代码更符合Pythonic的风格~
内容的提问来源于stack exchange,提问作者skibee




