读取稀疏矩阵文件时遇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
相关产品推荐
相关产品推荐

