Python赋值错误:图邻接矩阵创建问题求助
问题排查与解决:Python邻接矩阵赋值错误
咱们先揪出你代码里最核心的bug——邻接矩阵的初始化方式踩了列表浅拷贝的坑!
问题根源:列表乘法的陷阱
你用这行代码创建matrixFull:
matrixFull = [[0]*332]*332
这种写法会生成一个包含332个同一个子列表引用的列表。也就是说,所有行其实指向的是同一个列表对象!当你修改matrixFull[x][y]时,所有行的第y个元素都会跟着改变,这就导致你赋值后得到的矩阵完全不符合预期。
正确的矩阵初始化方式
换成列表推导式创建,让每一行都是独立的新列表:
# 用0.0初始化更适配浮点数权重的存储 matrixFull = [[0.0 for _ in range(332)] for _ in range(332)]
如果习惯用乘法,外层也要用推导式保证行的独立性:
matrixFull = [[0]*332 for _ in range(332)]
其他需要留意的细节
- 数据类型容错:你对
matrixD的元素做类型转换没问题,但如果数据源可能有异常值,可以加个简单的容错判断,避免转换失败抛出错误:for x in xrange(len(matrixD)): try: matrixD[x][0] = int(matrixD[x][0]) matrixD[x][1] = int(matrixD[x][1]) matrixD[x][2] = float(matrixD[x][2]) except ValueError: print(f"第{x}行数据格式错误:{matrixD[x]}") print(matrixD[x]) - 索引越界防护:要确保
x[0]和x[1]的取值在1-332之间,不然x[0]-1或x[1]-1会超出0-331的合法索引范围,抛出IndexError。可以在赋值前加个检查:for x in matrixD: u = x[0] - 1 v = x[1] - 1 if 0 <= u < 332 and 0 <= v < 332: matrixFull[u][v] = x[2] matrixFull[v][u] = x[2] else: print(f"无效节点编号:{x[0]} 或 {x[1]},跳过赋值")
修正后的完整代码
# 处理matrixD的数据类型 for x in xrange(len(matrixD)): try: matrixD[x][0] = int(matrixD[x][0]) matrixD[x][1] = int(matrixD[x][1]) matrixD[x][2] = float(matrixD[x][2]) except ValueError: print(f"第{x}行数据格式错误:{matrixD[x]}") print(matrixD[x]) # 正确初始化邻接矩阵 matrixFull = [[0.0 for _ in range(332)] for _ in range(332)] # 填充邻接矩阵 for x in matrixD: u = x[0] - 1 v = x[1] - 1 if 0 <= u < 332 and 0 <= v < 332: matrixFull[u][v] = x[2] matrixFull[v][u] = x[2] print(x[0], x[1], u, v) else: print(f"无效节点编号:{x[0]} 或 {x[1]}")
这样修改后,就能得到符合预期的无向图邻接矩阵了。
内容的提问来源于stack exchange,提问作者Tuấn Mạnh Nguyễn
相关产品推荐
相关产品推荐

