Python二维列表插入触发IndexError: list index out of range问题求助
问题分析与解决方案
首先,你遇到的IndexError: list index out of range错误,核心原因是**final列表的初始化和扩展逻辑不对**:
你初始化final=[[[]]],这意味着final只有一个元素(索引0的子列表)。当k=1时,你尝试访问final[1],但这个位置根本不存在,自然会触发索引越界错误。
除此之外,你的代码还有两个潜在问题需要修正:
1. 修复final的初始化与扩展问题
我们需要确保每次k递增时,final中已经存在对应的索引位置。最简单的方式是将final初始化为空列表,然后在每次k循环开始时,先向final添加一个空的子列表,这样final[k]就会存在:
final = [] # 初始化为空列表 k = 0 while k < (len(results)-7): final.append([]) # 先添加空列表,确保final[k]可访问 # 后续的元素插入逻辑 k += 1
2. 修正CSV文件读取的错误
你当前用str(row).split("|")来分割行数据是错误的:因为csv.reader默认会按逗号分割,但你的文件是PSV(竖线分隔),所以应该直接在csv.reader中指定分隔符delimiter="|",此时row本身就是分割好的列表,不需要再转字符串分割(否则会把列表的[]、'等符号也包含进去,导致数据错误):
results = [] with open("p100001.psv") as csvfile: # 指定竖线为分隔符,row直接是分割后的列表 reader = csv.reader(csvfile, delimiter="|") for row in reader: results.append(row) # 直接添加row即可,不需要额外处理
3. 简化内层元素插入逻辑
你原来的内层h和j循环逻辑存在逻辑错误:h在每次j循环时都会重置为0并递增,导致插入位置混乱。如果你的需求是把results[1+k]到results[7+k]这6行的所有元素依次添加到final[k]中,直接用extend方法即可,不需要复杂的索引计算:
final = [] k = 0 while k < (len(results)-7): final.append([]) # 遍历从1+k到6+k的行(range是左闭右开,所以7+k表示到6+k结束) for i in range(1+k, 7+k): final[k].extend(results[i]) # 将当前行的所有元素添加到final[k]中 k += 1
完整修正后的代码
import csv results = [] with open("p100001.psv") as csvfile: # 正确指定PSV文件的分隔符 reader = csv.reader(csvfile, delimiter="|") for row in reader: results.append(row) final = [] k = 0 # 确保循环条件正确,避免索引越界 while k < len(results) - 6: # 因为i到7+k,所以len(results)需要至少7+k,即k <= len(results)-7,等价于k < len(results)-6 final.append([]) for i in range(1 + k, 7 + k): final[k].extend(results[i]) k += 1
这样修改后,不仅解决了IndexError的问题,还修正了数据读取和元素插入的逻辑错误,应该能得到你预期的二维列表结构。
内容的提问来源于stack exchange,提问作者soheib




