You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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. 简化内层元素插入逻辑

你原来的内层hj循环逻辑存在逻辑错误: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

火山引擎 最新活动