(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)列表索引超出范围-迭代[重复]的主要内容,如果未能解决你的问题,请参考以下文章