【问题标题】:(Python) List index out of range - iteration [duplicate](Python)列表索引超出范围-迭代[重复]
【发布时间】:2014-01-16 03:44:38
【问题描述】:
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 out of range”为什么会这样?

【问题讨论】:

  • lst 是什么?请复制整个函数。
  • 如果你有五块钱,有人让你一一数出来,然后他们在你做的时候偷了一个,你不会数到五,对吗?跨度>

标签: python list indexing range out


【解决方案1】:

您正在修改您正在迭代的列表。如果你这样做,列表的大小会缩小,所以最终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]

【讨论】:

    【解决方案2】:

    当你迭代它时,你不应该 remove 来自 list 的项目;这会更改所有后续项目的索引,因此会更改 IndexError。你可以尝试一个简单的列表理解:

    lst = [item for item in lst if (item[0] != 1 and item[1] != 1)]
    

    【讨论】:

    • 或者如果目标是就地修改列表,那么lst[:] =
    【解决方案3】:

    通常这意味着您提供的索引不存在列表元素。

    例如,如果您的列表是 [12, 32, 50, 71],并且您请求索引 10 处的元素,那么您将超出范围并收到错误消息,因为只有元素 0 到 3 存在。

    【讨论】:

      【解决方案4】:

      问题是您删除列表中的项目会减小其大小。您要做的就是创建一个包含要删除的索引的数组,然后将它们向后删除。

      另一种方法是创建一个临时列表,您将添加您不想删除的元素,然后用包含您要保留的所有元素的列表覆盖您的初始列表。

      【讨论】:

        【解决方案5】:

        通过推理过程,我得出结论,您的 lst 看起来像这样:

        lst = [ ...[val1, val2], [val1, val2], [val1, val2]...]

        我认为这里发生的事情是您将“for i in range”与“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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-14
          • 1970-01-01
          • 2013-04-07
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多