8

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

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..乔

4

6 回答 6

26

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

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

numbers = [num for num in numbers if num % 2 == 0]
于 2013-08-13T19:01:05.397 回答
9

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

>>> filter(lambda x: not x % 2, [4,5,5,4])
[4, 4]
于 2013-08-14T08:47:51.780 回答
3

Instead of removing from numbers, try creating a new list appending only the values that meet your conditions.

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]

Or even simpler:

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

print purify([4,5,5,4])
于 2013-08-13T19:03:25.703 回答
1

你几乎拥有它。只需在 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从2个列表中删除重复项

于 2013-08-13T19:06:58.513 回答
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 在我之前发布了这个!如果您对列表推导感到困惑,请查看此处

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

于 2013-08-13T19:02:54.763 回答
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() 上都向左移动了一个位置。

于 2013-08-13T19:22:54.883 回答