如何在Networkx无向多重图中更新剩余边的键值(无需删加边)
解决NetworkX无向多重图边key重新编号的问题
要实现无需删加边就更新剩余边的key,核心是绕开只读的AdjacencyView,直接操作NetworkX多重图的底层存储结构:
可行代码示例
假设你要处理节点u和v之间的边,以下是具体实现:
import networkx as nx # 创建示例图并删除指定边 G = nx.MultiGraph() G.add_edge(0, 1, key=0, weight=10) G.add_edge(0, 1, key=1, weight=20) G.add_edge(0, 1, key=2, weight=30) G.remove_edge(0, 1, key=1) # 重新编号剩余边的key u, v = 0, 1 # 获取节点对的底层边字典 edge_dict = G._adj[u][v] # 按顺序重新分配key,生成新字典 new_edge_dict = {i: data for i, (old_key, data) in enumerate(edge_dict.items())} # 同步更新无向图的双向存储,避免数据不一致 G._adj[u][v] = new_edge_dict G._adj[v][u] = new_edge_dict # 验证结果 print(G[0][1]) # 输出:{0: {'weight': 10}, 1: {'weight': 30}}
关键说明
G._adj是NetworkX存储邻接关系的内部字典,无向图中G._adj[u][v]和G._adj[v][u]指向同一个边字典,必须同时更新两者,否则会出现单边数据异常。- 虽然
_adj属于未公开的内部属性,但在NetworkX 2.x、3.x稳定版本中均可稳定使用,适合这种需要直接修改边key的场景。 - 如果需要批量处理全图所有节点对的边key,可遍历
G.edges(keys=True)收集所有节点对,再逐个执行上述逻辑。
内容的提问来源于stack exchange,提问作者DrEucalyptus
相关产品推荐
相关产品推荐

