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

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)]

其他需要留意的细节

  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])
    
  2. 索引越界防护:要确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:12:20