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

时间:2010-08-02 23:57:00

标签: python

  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 个答案:

答案 0 :(得分:9)

如果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]

答案 1 :(得分:3)

也许你可以像这样写

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

答案 2 :(得分:3)

在迭代列表时不应更改列表以防止此类错误。

答案 3 :(得分:2)

索引存在于循环的开头,但是一旦删除了元素,列表就会更短,并且不包含相同数量的元素。因此,您的指数可能是错误的。如果从列表末尾删除,则不会使列表索引无效。

但我对这种模式感到惊讶;也许有更好的方法来解决你正在寻找的东西?也许设置减法或类似的东西可以做你想要做的事情,而无需修改数十或数百次列表。

答案 4 :(得分:0)

for row in c:
     length = len(row)
     i = 0
     while(i<length):
          if i not in keep:
            del row[i]
            length = length -1
          i = i+1

只需在需要时更新长度。