【问题标题】:How to filter a list [duplicate]如何过滤列表[重复]
【发布时间】:2013-08-15 12:54:36
【问题描述】:

我正在编写一个简单的函数来从列表中取出任何奇数并返回仅包含偶数的列表。

def purify(numbers):
for i in numbers:
    if i%2!=0:
       numbers.remove(i)
return numbers    

print purify([4,5,5,4])

当应用在上面时

它返回: [4, 5, 4] 为什么第二个 5 也没有被删除 证明 if 的合理性?

我较少寻找解决问题的不同方法,而是更多地了解为什么会发生这种情况。

感谢和抱歉,如果这是愚蠢的 q.. 乔

【问题讨论】:

  • 不幸的是,我知道这是重复的。
  • purify中的代码要缩进,否则不起作用。
  • 如果列表很长,您可以在扫描前用 numbers = list(set(numbers)) 去除重复项。在此示例中,它不值得,但对于大数据集,最好预先消除冗余检查

标签: python


【解决方案1】:

当您移除一个项目时,后面的项目会向左移动一个位置。这会导致循环跳过一些项目。

顺便说一句,编写该代码的一种更惯用的方式是

numbers = [num for num in numbers if num % 2 == 0]

【讨论】:

【解决方案2】:

讽刺的是,我没有看到提到的一个选项是filter

>>> filter(lambda x: not x % 2, [4,5,5,4])
[4, 4]

【讨论】:

    【解决方案3】:

    不要从numbers 中删除,而是尝试创建一个新列表,仅附加符合您条件的值。

    def purify(numbers):
        newNumber = []
        for i in numbers:
            if i%2 ==0:
               newNumber.append(i)
        return newNumber    
    
    >>>print purify([4,5,5,4])
    [4, 4]
    

    甚至更简单:

    def purify(numbers):
        return [i for i in numbers if i % 2 == 0]
    
    print purify([4,5,5,4])
    

    【讨论】:

    • 第二种方法更好,特别是在处理大列表时。
    【解决方案4】:

    你几乎拥有它。只需在 for i 之后添加 [:] 在数字中,这将遍历列表的副本。

    def purify(numbers):
        for i in numbers[:]:
            if i%2!=0:
                numbers.remove(i)
        return numbers    
    
    print purify([4,5,5,4])
    

    下面有很好的解释

    python remove duplicates from 2 lists

    【讨论】:

      【解决方案5】:
      >>> listToPurify = [1, 2, 2, 3, 4, 5, 6, 6, 5]
      >>> purified = [i for i in listToPurify if i % 2]
      >>> purified
      [1, 3, 5, 5]
      

      似乎 NPE 在我之前发布了这个!如果您对列表推导感到困惑,请查看here

      如果您更喜欢使用for 循环,您将不得不处理列表长度正在变化的事实。

      【讨论】:

        【解决方案6】:

        要获得更清晰的图片,请在每次迭代中打印列表并查看列表发生的情况并查看迭代如何继续。

        # i have taken all odd number to try to remove all numbers from list
        >>> list = [1,3,5,7]
        >>> for num in list:
        ...     if num % 2 != 0:
        ...         list.remove(num)
        ...     print(list)
        ...
        [3, 5, 7]
        [3, 7]
        

        您可以看到元素在每个 remove() 上都向左移动了一个位置。

        【讨论】:

          猜你喜欢
          • 2012-12-12
          • 2012-04-10
          • 2015-01-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-25
          • 2014-02-04
          • 1970-01-01
          相关资源
          最近更新 更多