为了账号安全,请及时绑定邮箱和手机立即绑定

列表索引超出范围python

列表索引超出范围python

墨色风雨 2021-03-19 19:15:16
我正在尝试在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]它们的长度都是一样的,所以我不知道为什么我遇到列表索引错误,将不胜感激!
查看完整描述

2 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

举个例子:


[1、2、3、4、5]


该列表的长度为5,范围(5)= [0,1,2,3,4]


假设在迭代1中,您删除了一个元素。现在列表的长度为4,但您仍将遍历第5个索引。在这种情况下,第五个元素不再存在。


这次,您可能遇到的另一个问题是不会跳过元素,而不会产生错误。以相同的示例为例,您将1删除。将第二个元素2移到0索引,而当迭代第二个索引列表1时实际上是3,完全跳过以检查先前的第二个元素(2)。


在大多数计算语言中解决此问题的常用方法是向后遍历该列表。


但是在python中,最好的方法实际上是先进行搜索,然后进行删除操作。首先搜索所有需要删除的元素,将它们存储在一组中,然后从列表中逐一删除它们。


另一种方法是使用itertools过滤器创建过滤列表:


import itertools


ifilter(lambda x: x==nMoments, moment_list_sum)


查看完整回答
反对 回复 2021-03-31
?
呼唤远方

TA贡献1856条经验 获得超11个赞

正如其他人提到的那样,您正在修改列表的长度,因此到结束时,您正在查看的索引不再存在。


相反,您应该建立包含所需元素的替换列表。这可能会起作用:


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])

这样做是将两个目标列表连接在一起,然后使用枚举对它们进行迭代以提供一个索引,您可以使用该索引在第三个列表中进行查找,然后将其解压缩。


查看完整回答
反对 回复 2021-03-31
  • 2 回答
  • 0 关注
  • 529 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信