列表索引超出范围python

我正在尝试在Python中做一个相当琐碎的操作,但是对于为什么我moment_list.remove(moment_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

正如你所看到的,我想从两个列表中删除索引moment_list和LHS所有满足其他列表等于nMoments的循环,如果条件下,相同指数。


进入循环nMoments是一个等于3的int,列表为:


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]

它们的长度都是一样的,所以我不知道为什么我遇到列表索引错误,将不胜感激!


墨色风雨
浏览 532回答 2
2回答

开心每一天1111

举个例子:[1、2、3、4、5]该列表的长度为5,范围(5)= [0,1,2,3,4]假设在迭代1中,您删除了一个元素。现在列表的长度为4,但您仍将遍历第5个索引。在这种情况下,第五个元素不再存在。这次,您可能遇到的另一个问题是不会跳过元素,而不会产生错误。以相同的示例为例,您将1删除。将第二个元素2移到0索引,而当迭代第二个索引列表1时实际上是3,完全跳过以检查先前的第二个元素(2)。在大多数计算语言中解决此问题的常用方法是向后遍历该列表。但是在python中,最好的方法实际上是先进行搜索,然后进行删除操作。首先搜索所有需要删除的元素,将它们存储在一组中,然后从列表中逐一删除它们。另一种方法是使用itertools过滤器创建过滤列表:import itertoolsifilter(lambda x: x==nMoments, moment_list_sum)

呼唤远方

正如其他人提到的那样,您正在修改列表的长度,因此到结束时,您正在查看的索引不再存在。相反,您应该建立包含所需元素的替换列表。这可能会起作用: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])这样做是将两个目标列表连接在一起,然后使用枚举对它们进行迭代以提供一个索引,您可以使用该索引在第三个列表中进行查找,然后将其解压缩。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python