(Python)列表索引超出范围 - 迭代

时间:2013-12-28 21:21:02

标签: python list indexing range out

for i in range(len(lst)):    
   if lst[i][0]==1 or lst[i][1]==1:
        lst.remove(lst[i])
return lst

这会给出“IndexError:list index超出范围”为什么会发生这种情况?

5 个答案:

答案 0 :(得分:9)

您正在修改您正在迭代的列表。如果你这样做,列表的大小会缩小,所以最终lst[i]将超出列表的边界。

>>> lst = [1,2,3]
>>> lst[2]
3
>>> lst.remove(1)
>>> lst[1]
3
>>> lst[2]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

构建新列表更安全:

return [item for item in lst if item[0]!=1 and item[1]!=1]

答案 1 :(得分:7)

当您迭代它时,您不应该remove listIndexError项;这会更改所有后续项目的索引,因此会更改lst = [item for item in lst if (item[0] != 1 and item[1] != 1)] 。你可以尝试一个简单的列表理解:

{{1}}

答案 2 :(得分:2)

通常,这意味着您提供的列表元素不存在的索引。

例如,如果您的列表是[12,32,50,71],并且您要求索引为10的元素,那么您将完全超出界限并收到错误,因为只存在元素0到3。 / p>

答案 3 :(得分:0)

问题是您删除列表中减少其大小的项目。你要做的是创建一个包含你想要删除的索引的数组,然后将它们向后移除。

另一种方法是创建一个临时列表,您可以添加不想删除的元素,然后用包含您要保留的所有元素的列表覆盖您的初始列表。

答案 4 :(得分:0)

通过演绎过程,我得出结论,你的lst看起来像这样:

lst = [... [val1,val2],[val1,val2],[val1,val2] ...]

我认为这里发生的事情是你把'我在范围内'与'for i in'混淆了(我已经做了很多次了。)

发生错误的行是:
    lst.remove(LST [I])

您可以通过简单地更改代码来更正此问题:

for i in lst:  
    if i[0] ==1 or i[1] ==1:  
        lst.remove(lst[i])
return lst

你的代码在list [i]之前的结构方式没有任何意义,你的i是一个大于lst中两个值项的数量的数字。

= d