Python:列表赋值索引超出范围

2 投票
5 回答
15596 浏览
提问于 2025-04-16 02:13
  for row in c:
    for i in range(len(row)):
      if i not in keep:
        del row[i]

我在最后一行遇到了这个错误:

IndexError: list assignment index out of range

我不明白为什么它会超出范围,如果它确实存在的话!请帮帮我

5 个回答

3

在你遍历一个列表的时候,不要去修改它,这样可以避免出现错误。

4

也许你可以这样写

for row in c:
    row[:] = [x for i,x in enumerate(row) if i in keep]
10

如果 row 是一个列表,记住删除列表中的一个元素会导致后面的所有元素都向前移动一个位置来填补这个空缺。所以,之后的索引会出现偏差(每次你再删除一个元素,索引的偏差就会增加一)。为了避免这个问题,有几种方法可以尝试——其中一种就是从后往前遍历列表。

关于如何从后往前遍历,你可以试试使用 range 函数的额外参数。前两个参数定义了要遍历的范围(下限是包含的,上限是不包含的),第三个参数是步长:

>>> range(5)
[0, 1, 2, 3, 4]
>>> range(0, 5)
[0, 1, 2, 3, 4]
>>> range(3, 5)
[3, 4]
>>> range(3, 5, -1)
[]
>>> range(5, 3, -1)
[5, 4]

所以,在你的情况下,似乎你需要:

range(len(row) - 1, -1, -1)

或者更容易阅读的方式(感谢 viraptor):

reversed(range(len(row))

另外,你也可以尝试使用列表推导式(我假设 c 是一个列表):

for row_number, row in enumerate(c):
    c[row_number] = [x for i, x in enumerate(row) if i in keep]

撰写回答