Python 列表索引超出范围
我试图用Python做一个相当简单的操作,但是我不明白为什么我会在Python 列表索引超出范围,python,Python,我试图用Python做一个相当简单的操作,但是我不明白为什么我会在moment\u list.remove(moment\u list[I])的标题中得到错误消息 行。我的代码是: for i in range(0,len(moment_list_sum)): if moment_list_sum[i]==nMoments: moment_list.remove(moment_list[i]) LHS.remove(LHS[i]) else:
moment\u list.remove(moment\u list[I])的标题中得到错误消息
行。我的代码是:
for i in range(0,len(moment_list_sum)):
if moment_list_sum[i]==nMoments:
moment_list.remove(moment_list[i])
LHS.remove(LHS[i])
else:
pass
如您所见,我正在尝试从满足if循环条件的两个列表中删除索引,另一个列表中的相同索引等于nMoments
进入循环nMoments的整数等于3,列表如下:
LHS [y_0, y_1, yx1, yx2, yx3, yx4, yx5, yx6, yx7]
moment_list [[1, 0], [0, 1], [0, 2], [1, 1], [2, 0], [0, 3], [1, 2], [2, 1], [3, 0]]
moment_list_sum [1, 1, 2, 2, 2, 3, 3, 3, 3]
它们都是相同的长度,所以我不知道为什么会出现列表索引错误,非常感谢您的帮助 举个例子:
[1,2,3,4,5]
此列表的长度为5,范围(5)=[0,1,2,3,4]
假设在迭代1中删除一个元素。现在列表的长度是4,但您仍将迭代第5个索引。在这种情况下,第五个元素不再存在
您可能遇到的另一个问题(这次没有生成错误)是元素跳过。
以相同的示例,删除1。第二个元素是2,被移动到0索引,当您迭代到第二个索引列表时,实际上是3,完全跳过以检查前面的第二个元素(2)
在大多数计算语言中,解决这个问题的一种常见方法是向后迭代列表
但在python中,最好的方法实际上是先执行搜索,然后执行删除操作。首先搜索所有需要删除的元素,将它们存储在一个集合中,然后逐个从列表中删除它们
另一种方法是使用过滤器创建过滤列表:
正如其他人提到的,您正在修改列表的长度,因此当您到达末尾时,您正在查看的索引已经不存在了 相反,您应该建立由所需元素组成的替换列表。这可能会奏效:
LHS, moment_list = zip(*[
(LHS_elem, moment_list_elem)
for i, (LHS_elem, moment_list_elem) in enumerate(zip(LHS, moment_list))
if moment_list_sum[i] != nMoments])
这样做的目的是将两个目标列表连接在一起,然后使用enumerate对它们进行迭代,以给出一个索引,您可以使用该索引在第三个列表中查找,然后在最后将其解压缩。您打破了在迭代列表索引时不删除列表元素的规则!您能发布整个错误消息吗,这样我们就可以看到异常的原因了?整个消息是MFK_final moment_list中第282行的“File”MEA.py。删除(moment_list[i])索引器:列表索引超出范围`我没有更改moment_list\u sum我正在使用它的索引,我正在改变的是LHS和moment_list@user1987097您提到列表的长度是相同的,因此如果您删除任何列表的元素,您将在最后一次迭代中得到一个错误,因为该索引将不再存在。
LHS, moment_list = zip(*[
(LHS_elem, moment_list_elem)
for i, (LHS_elem, moment_list_elem) in enumerate(zip(LHS, moment_list))
if moment_list_sum[i] != nMoments])