如何过滤列表

时间:2013-08-13 18:59:42

标签: python

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

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?

我不太关注问题的不同方法,而是更多地了解为什么会发生这种情况。

谢谢,对不起,如果这是愚蠢的.. 乔

7 个答案:

答案 0 :(得分:13)

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

BTW,编写该代码的更惯用的方式是

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

答案 1 :(得分: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])

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

你几乎拥有它。只需在数字后面添加[:],然后迭代列表的副本。

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

答案 4 :(得分:1)

顺便说一句,更好的方法是检查数字是否为奇数。

而不是%使用&。它稍快一些。

def isOdd(n):
    return 1 & n == 1

答案 5 :(得分:0)

>>> 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 :(得分:0)

为了更清晰的图片打印每次迭代中的列表,看看列出的内容,看看迭代是如何继续的。

# 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()上向左移动了一个位置。