Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表索引超出范围_Python - Fatal编程技术网

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:

我试图用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:
        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])