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

邻接矩阵转邻接表字典报错TypeError,求错误原因及代码修正方案

邻接矩阵转邻接表:错误分析与修正方案

错误原因

你的代码抛出TypeError: 'int' object is not iterable的核心原因有两点:

  1. 参数类型不匹配:enumerate(adjmat)返回的是(索引i, 行列表key)的迭代对,其中i是整数类型。而zip()函数要求所有传入的参数都是可迭代对象(如列表、元组),整数无法被迭代,因此触发错误。
  2. 逻辑偏离需求:你试图把行列表作为字典的键、索引作为值,但邻接表的正确结构应该是节点编号(对应矩阵行索引)为键,该行的相邻节点/边信息为值,你的代码逻辑完全不符合这个要求。

修正方案

根据邻接表的常见使用场景,提供两种修正方案:

方案1:存储相邻节点编号(适用于邻接矩阵元素表示边的存在性/权重)

如果邻接矩阵中adjmat[i][j]不为0时,表示节点i与节点j存在边,邻接表存储节点i的所有相邻节点编号:

from typing import List, Dict

adjmat = [[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [3, 6, 9, 12, 15]]
 
def adjmat_to_adjlist(adjmat: List[List[int]]) -> Dict[int, List[int]]:
    adjlist = {}
    for node_idx, row in enumerate(adjmat):
        # 筛选出所有存在边的目标节点编号
        neighbors = [target_idx for target_idx, val in enumerate(row) if val != 0]
        adjlist[node_idx] = neighbors
    return adjlist

print(adjmat_to_adjlist(adjmat))

输出结果:

{0: [0, 1, 2, 3, 4], 1: [0, 1, 2, 3, 4], 2: [0, 1, 2, 3, 4]}

方案2:直接存储行内的边权值(适用于需要保留权重信息的场景)

如果你的需求是直接将每行的权重值作为邻接表的值:

from typing import List, Dict

adjmat = [[1, 2, 3, 4, 5], [2, 4, 6, 8, 10], [3, 6, 9, 12, 15]]
 
def adjmat_to_adjlist(adjmat: List[List[int]]) -> Dict[int, List[int]]:
    # 以行索引为节点编号,行列表为对应的值
    return {i: row.copy() for i, row in enumerate(adjmat)}

print(adjmat_to_adjlist(adjmat))

输出结果:

{0: [1, 2, 3, 4, 5], 1: [2, 4, 6, 8, 10], 2: [3, 6, 9, 12, 15]}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:31:04