You need to enable JavaScript to run this app. Python 如何将带权邻接表转换为嵌套列表形式的邻接矩阵
优惠活动
大模型
产品
解决方案
定价
更多

Python 如何将带权邻接表转换为嵌套列表形式的邻接矩阵

问题原因

你碰到的ValueError本质是:带权邻接表的每行元素为(邻接点名, 权重)格式的元组,原有代码直接把整个元组当成邻接点名去节点列表中查找,自然会触发元素不存在的报错。
另外你提供的带权邻接表示例存在笔误:'M': [(I, 3), (K, 6)]中的I、K未加引号,运行时会先抛出NameError,需修正为[('I', 3), ('K', 6)]。

调整后的通用实现(兼容无权/带权邻接表)

相比原有直接调用keys.index()的写法,我们额外增加一层「节点到矩阵索引的映射」,既提升查找效率,也能自动适配两种邻接表格式:

# 1. 获取所有节点并排序,生成节点-索引映射
keys = sorted(g.keys())
node2idx = {node: idx for idx, node in enumerate(keys)}
node_count = len(keys)

# 2. 初始化邻接矩阵
# 若权重可能为0,可将默认值改为`float('inf')`表示无连接
M = [[0] * node_count for _ in range(node_count)]

# 3. 遍历邻接表填充矩阵
for origin_node, neighbor_list in g.items():
    origin_idx = node2idx[origin_node]
    for item in neighbor_list:
        # 自动区分无权/带权场景
        if isinstance(item, tuple):
            # 带权场景:拆出邻接点和权重
            target_node, weight = item
        else:
            # 无权场景:权重默认设为1
            target_node, weight = item, 1
        target_idx = node2idx[target_node]
        M[origin_idx][target_idx] = weight
效果说明

节点排序后为['I','J','K','L','M'],对应矩阵行/列索引0-4:

  • 针对无权邻接表,最终生成的邻接矩阵为:
[
 [0, 1, 1, 0, 1],
 [1, 0, 1, 1, 0],
 [1, 1, 0, 0, 1],
 [0, 1, 0, 0, 0],
 [1, 0, 1, 0, 0]
]
  • 针对修正后的带权邻接表,最终生成的邻接矩阵为:
[
 [0, 1, 2, 0, 3],
 [1, 0, 7, 5, 0],
 [2, 7, 0, 0, 6],
 [0, 5, 0, 0, 0],
 [3, 0, 6, 0, 0]
]

注意:如果你的带权图存在权重为0的边,初始化矩阵时不要用0作为默认值,可替换为float('inf')表示节点间无连接,避免和权重为0的边混淆。

内容的提问来源于stack exchange,提问作者meterrible21

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 06:45:03