邻接矩阵转邻接表字典报错TypeError,求错误原因及代码修正方案
邻接矩阵转邻接表:错误分析与修正方案
错误原因
你的代码抛出TypeError: 'int' object is not iterable的核心原因有两点:
- 参数类型不匹配:
enumerate(adjmat)返回的是(索引i, 行列表key)的迭代对,其中i是整数类型。而zip()函数要求所有传入的参数都是可迭代对象(如列表、元组),整数无法被迭代,因此触发错误。 - 逻辑偏离需求:你试图把行列表作为字典的键、索引作为值,但邻接表的正确结构应该是节点编号(对应矩阵行索引)为键,该行的相邻节点/边信息为值,你的代码逻辑完全不符合这个要求。
修正方案
根据邻接表的常见使用场景,提供两种修正方案:
方案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
相关产品推荐
相关产品推荐

