【问题标题】:Why doesn't python remove these numbers from my array? [duplicate]为什么 python 不从我的数组中删除这些数字? [复制]
【发布时间】:2017-08-19 15:19:14
【问题描述】:

我的计划是删除 0 到 1000 中少于两位数的所有数字。 我正在这样做:

numbers = range(0,1001)
#check for two or more digits
for number in numbers:
    if len(str(number)) < 2:
        numbers.remove(number)

当我检查我的数组时,它仍然包含这些数字“1、3、5、7、9”。 这是为什么呢?

【问题讨论】:

  • Iirc,在迭代列表时从列表中删除通常会导致不良结果。为什么不使用过滤列表推导?
  • 完成@Carcigenicate的评论:[i for i in range(0, 1001) if len(str(i)) &gt;= 2]
  • 我试图记住发布答案的语法:0。太久没写了。
  • @Carcigenicate Here's a nice refresher 如果您想重新回到游戏中。如果您想在 Python 标记中回答此类问题,您将需要它 ;-)
  • 从您正在迭代的列表中删除项目通常是不安全的,除非您向后迭代。这很像锯掉你坐在的树枝。 ;) 详情请见here。

标签: python arrays python-2.7 numbers


【解决方案1】:

您不应该在迭代列表或其他类型的容器时对其进行更改。这就是发生的错误。详情请见here。


更准确地说,当您从列表中删除当前或更早的元素时,您会将其移向“左侧”。由于循环很可能被转换为经典的 for 循环,因此您最终会跳过向左移动的元素。

【讨论】:

    【解决方案2】:

    迭代器不知道底层列表的变化。它只是返回下一个可用数字,这意味着在您删除 0 之后,迭代器当前指向 1,因此产生 2 作为下一个要检查的值。简短的回答是:不要修改您正在迭代的列表。

    相反,创建一个包含您想要保留的值的新列表:

    numbers = range(0, 1001)
    new_numbers = []
    for number in numbers:
        if len(str(number)) >= 2:
            new_numbers.append(number)
    
    numbers = new_numbers
    

    更简单地说,使用列表推导:

    numbers = [x for x in numbers if len(str(x)) >= 2]
    

    【讨论】:

      【解决方案3】:

      我看到两个可能的问题。首先,它是一个范围,而不是一个实际的数组。其次,在迭代列表时修改列表是个坏主意。 Confider 使用列表推导式。

      numbers = [n for n in range(0,1001) if len(str(n)) >= 2]
      

      【讨论】:

      • 好点,但是,OP 使用的是 Python 2,其中 range 返回一个实际的 list 对象。如果您尝试在 Python 3 range 上调用 .remove,它将引发 AttributeError: 'range' object has no attribute 'remove'
      【解决方案4】:

      for 循环只是生成一个索引来迭代列表。您正在修改循环内的列表,因此它不会给出正确的结果。

      假设您有一个 len = 10 的列表

      numbers = [0,1,2,3,4,5,6,7,8,9]
      

      然后你运行这个循环

      for number in numbers:
          if number < 2:
              numbers.remove(number)
      

      在第一次迭代中,索引为 0,数字为 [0,1,2,3,4,5,6,7,8,9],它将删除 numbers[0] = 0

      在第二次迭代中,索引将为 1,而数字列表将为 [1,2,3,4,5,6,7,8,9],因为我们在最后一个循环中删除了第一个元素,它现在将删除 numbers[1] = 2

      等等。

      做你想做的最好的方法是使用列表理解:

      numbers = [x for x in numbers if len(str(number)) > 2]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        • 2021-07-11
        • 1970-01-01
        • 2021-11-28
        • 2023-03-11
        • 1970-01-01
        • 2021-12-16
        相关资源
        最近更新 更多