You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 17:52:54