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超出范围”为什么会发生这种情况?
答案 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
list
项IndexError
项;这会更改所有后续项目的索引,因此会更改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