(Python)列表索引超出范围-迭代[重复]

Posted

技术标签:

【中文标题】(Python)列表索引超出范围-迭代[重复]【英文标题】:(Python) List index out of range - iteration [duplicate] 【发布时间】:2014-01-16 03:44:38 【问题描述】:
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 out of range”为什么会这样?

【问题讨论】:

lst 是什么?请复制整个函数。 如果你有五块钱,有人让你一一数出来,然后他们在你做的时候偷了一个,你不会数到五,对吗?跨度> 【参考方案1】:

您正在修改您正在迭代的列表。如果你这样做,列表的大小会缩小,所以最终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]

【讨论】:

【参考方案2】:

当你迭代它时,你不应该 remove 来自 list 的项目;这会更改所有后续项目的索引,因此会更改 IndexError。你可以尝试一个简单的列表理解:

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

【讨论】:

或者如果目标是就地修改列表,那么lst[:] =【参考方案3】:

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

例如,如果您的列表是 [12, 32, 50, 71],并且您请求索引 10 处的元素,那么您将超出范围并收到错误消息,因为只有元素 0 到 3 存在。

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

通过推理过程,我得出结论,您的 lst 看起来像这样:

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

我认为这里发生的事情是您将“for i in range”与“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

【讨论】:

以上是关于(Python)列表索引超出范围-迭代[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Python中获取超出范围的索引默认值[重复]

当我遍历我的列表时,返回列表索引超出范围

Python - 索引错误 - 列表索引超出范围

IndexError:列表索引超出范围 - python 错误

Python:IndexError:列表索引超出范围

Python循环:列表索引超出范围