如何在NetworkX中修改边属性名,是否可避免遍历全量边列表
问题解答
NetworkX 官方目前没有内置的rename_edge_attr方法,同时完全不遍历边列表的实现方式不存在:边属性存储在每条边独立的属性字典中,要全局修改属性名必须遍历所有边的属性字典完成键的替换。
你可以通过给 NetworkX 图类扩展自定义方法的方式,实现你期望的调用形式,底层自动封装遍历逻辑,对上层使用无感知:
自定义方法实现
import networkx as nx def rename_edge_attr(self, old_name, new_name): # 遍历所有带属性的边,替换属性名 for _, _, attrs in self.edges(data=True): if old_name in attrs: attrs[new_name] = attrs.pop(old_name) # 将方法绑定到所有常用 NetworkX 图类,支持无向图、有向图、多图等 nx.Graph.rename_edge_attr = rename_edge_attr nx.DiGraph.rename_edge_attr = rename_edge_attr nx.MultiGraph.rename_edge_attr = rename_edge_attr nx.MultiDiGraph.rename_edge_attr = rename_edge_attr
调用示例
# 初始化测试图 g = nx.Graph() g.add_edge(1, 2, foo=10, bar=20) g.add_edge(2, 3, foo=30, bar=40) # 按你期望的形式调用重命名方法 g.rename_edge_attr(old_name="foo", new_name="baz") # 验证结果:输出 {'bar': 20, 'baz': 10} print(g.edges[1, 2])
简化单行实现
如果不想扩展类,也可以直接用单行代码完成需求:
nx.set_edge_attributes(g, {e: attrs.pop("foo") for e, attrs in g.edges.items()}, "baz")
注:遍历修改字典键的开销极低,即使是百万级边的大图,该操作的耗时也几乎可以忽略,绝大多数场景下不会成为性能瓶颈。
内容的提问来源于stack exchange,提问作者Will Maclean
相关产品推荐
相关产品推荐

