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

读取稀疏矩阵文件时遇Decimal列表索引越界问题求助

解决稀疏矩阵读取的IndexError及逻辑问题

首先,咱们先定位你遇到的IndexError: list index out of range问题——这个错误出在value = Decimal(values[0]),说明values是空列表,或者当前处理的行拆分后没有足够的元素。核心原因是你的文件读取逻辑完全不符合给定的文件格式,加上后续的稀疏矩阵存储逻辑也有问题,咱们一步步来修正:

1. 修复文件读取逻辑

你的文件格式有几个关键点:

  • 第一行是54321 | This | Table |,其中第一个数字54321是矩阵维度,后面的描述可以忽略
  • 第二行是表头分隔线(| :------: |:-----: |:-----: |),需要跳过
  • 从第三行开始才是真正的稀疏矩阵元素行,每行格式是| 数值 | 行索引 | 列索引 |

原来的代码直接读取第一行转成整数,还循环读取n行到b里,这完全错误(54321行根本不存在),导致后续读取数据行时要么读到空,要么读到格式错误的行。修正后的读取逻辑如下:

from decimal import Decimal

def read_values(filename):
    with open(filename,'r') as file:
        # 读取第一行,提取矩阵维度
        first_line = file.readline().strip()
        n = int(first_line.split('|')[0].strip())  # 取第一个|前的数字
        
        # 跳过表头分隔行
        file.readline()
        
        # 初始化稀疏矩阵:索引对应行号,每个元素是列号到值的字典(高效存储稀疏数据)
        sparse_matrix = [dict() for _ in range(n)]  
        
        for line in file:
            line = line.strip()
            if not line:  # 跳过空行
                continue
            # 处理每行:去掉首尾的|,分割后去除每个部分的空格
            parts = [p.strip() for p in line.strip('|').split('|')]
            if len(parts) !=3:  # 跳过格式错误的行
                continue
            try:
                value = Decimal(parts[0])
                x = int(parts[1])
                y = int(parts[2])
            except (ValueError, IndexError):
                continue  # 跳过无法转换的脏数据
            
            # 处理元素累加:如果行x已有列y,就累加值,否则添加
            if y in sparse_matrix[x]:
                sparse_matrix[x][y] += value
            else:
                sparse_matrix[x][y] = value
    
    return sparse_matrix

2. 修正原有的行/列索引查找逻辑

你原来的getLineIndex和getColumnIndex函数逻辑存在明显错误:

  • getLineIndex里的a[lineIndex][-1]是取每行的最后一个元素((value, columnNumber)),但你错误地把它当成了(diagonalValue, lineNumber),根本无法定位到正确的行号
  • 用字典存储每行的列映射比手动遍历列表查找高效得多,不需要额外写查找函数——直接通过行号x和列号y就能访问对应的值

如果坚持要用列表嵌套列表的结构,那需要调整存储逻辑:让sparse_matrix的索引直接对应行号,比如sparse_matrix[x]就是行x的所有元素,这样不需要查找行索引,直接用x访问即可。

3. 额外优化提示

  • 如果矩阵维度特别大(比如百万级),建议用字典存储行号到列字典的映射,节省内存:sparse_matrix = dict(),处理时先判断x是否在字典中,不存在则初始化空字典
  • 保留异常处理可以避免文件中出现脏数据时程序直接崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:13:15