【问题标题】:Why do I get an IndexError: list index out of range为什么我得到一个 IndexError: list index out of range
【发布时间】:2020-10-16 23:28:31
【问题描述】:

在我的代码中出现索引错误 - IndexError: list index out of range。您能否 1)解释为什么会这样,然后 2)对我的代码进行一些更正?提前感谢您的回答

x = [1, 2, 3, 4, 5]

for i in range(len(x)):
    if x[i] % 2 == 0:
        del x[i]

【问题讨论】:

  • 您的预期输出是什么?
  • 不要从您当前正在迭代的列表中删除项目 - 改用列表推导式。
  • 在迭代时删除项目 - 这是一个非常糟糕的主意:)

标签: python list arraylist error-handling index-error


【解决方案1】:

如果要删除某些项目,请使用 while 循环而不是 for 循环。

    x = [1, 2, 3, 4, 5]
    i = 0
    while i<len(x):
        if x[i]%2==0:
            del x[i]
        i+=1
    print(x)

【讨论】:

    【解决方案2】:
    x = [1, 2, 3, 4, 5]
    
    for i in range(len(x) -1, -1, -1):
        if x[i] % 2 == 0:
            x.pop(i)
    

    "range 函数接受三个参数。

    首先是起始索引,即[list的长度- 1],即最后一个列表元素的索引(因为列表元素的索引从0开始到长度- 1)。

    第二个参数是停止迭代的索引。

    第三个参数是步长。 因为我们需要在每次迭代中将索引减少 1,所以这应该是 -1。" - Source

    我强烈推荐列表理解,但是在某些情况下没有意义,通过迭代删除是可以的。由你决定~

    【讨论】:

      【解决方案3】:

      改用新列表(理解):

      x = [1, 2, 3, 4, 5]
      
      y = [item for item in x if not item % 2 == 0]
      print(y)
      # [1, 3, 5]
      

      或者 - 被认为是“更 Pythonic”:

      y = [item for item in x if item % 2]
      

      【讨论】:

        【解决方案4】:

        这是因为您要删除循环内的对象,换句话说,使列表更短。

        改用这个:

        x = x[0::2]
        

        选择列表的每一秒值

        如果您想要所有偶数值,请改用列表生成器:

        x = [value for value in x in value%2 == 0]
        

        【讨论】:

        • 他想删除甚至不是偶数索引的项目
        【解决方案5】:

        您正在从您正在迭代的列表中删除项目。另一种方法是:

        x = [1, 2, 3, 4, 5]
        answer = [i for i in x if i % 2 != 0]
        
        print(answer)
        

        输出:

        [1, 3, 5]
        

        【讨论】:

          【解决方案6】:

          当您使用 del 时,您会减小数组的大小,但初始循环会通过数组的初始大小,因此会出现 IndexError。

          如果你想删除项目,我建议使用列表理解:

          x = [1, 2, 3, 4, 5]
          
          x_filtered = [i for i in x if i%2]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-02-11
            • 1970-01-01
            • 1970-01-01
            • 2019-04-15
            • 2018-05-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多