Python:从列表中删除奇数

neo*_*eo0 7 python

我写了一个函数来从列表中删除奇数,就像这样:

def remove_odd(l):
    for i in l:
        if i % 2 != 0:
            l.remove(i)
    print l
    return l

remove_odd([4,5,4])
remove_odd([4,5,4,7,9,11])
remove_odd([4,5,4,7,9,11,12,13])
Run Code Online (Sandbox Code Playgroud)

它返回:

[4, 4]
[4, 4, 9]
[4, 4, 9, 12]
Run Code Online (Sandbox Code Playgroud)

- >错了

但当我改为删除偶数时:

def remove_even(l):
    for i in l:
        if i % 2 == 0:
            l.remove(i)
    print l
    return l

remove_even([4,5,4])
remove_even([4,5,4,7,9,11])
remove_even([4,5,4,7,9,11,12,13])
Run Code Online (Sandbox Code Playgroud)

答案还可以:

[5]
[5, 7, 9, 11]
[5, 7, 9, 11, 13]
Run Code Online (Sandbox Code Playgroud)

remove_odd()函数有什么问题?我知道人们通常会在func中创建第二个列表,然后将偶数附加到该列表中,但是我们可以用list.remove()解决这个练习吗?

谢谢!

Alt*_*ion 10

您的功能正在以您预期的方式工作.该for回路采用第一个元素,比第二等,所以当你删除一个元素,别人改变自己的位置,并且可以通过它可以跳过(和你的情况发生这种情况),当他们被另一个奇数开头.

如果您坚持使用.remove()方法,则必须使用副本进行操作,如下所示:

def remove_odd(1):
    for i in l[:]:
        if i % 2 != 0:
            l.remove(i)
    return l
Run Code Online (Sandbox Code Playgroud)

(l[:]是列表的浅表副本l)

但是,我认为使用列表理解会更加清晰:

def remove_odd(l):
    return [x for x in l if x % 2 == 0]
Run Code Online (Sandbox Code Playgroud)


Abh*_*jit 6

remove_odd() 函数有什么问题?

您正在迭代列表,同时更改其大小。这导致它跳过一个或多个元素

为什么不使用列表理解。它更 Pythonic 和可读

def remove_odd(l):
    return [e for e in l if e % 2 == 0]

remove_odd([4,5,4,7,9,11])
[4, 4]
Run Code Online (Sandbox Code Playgroud)

同样,您可以编写 remove_even 例程

def remove_even(l):
    return [e for e in l if e % 2]

remove_even([4,5,4,7,9,11])
[5, 7, 9, 11]
Run Code Online (Sandbox Code Playgroud)


Tho*_*anz 5

为此,Python 有一个内置方法: filter

filtered_list = filter(lambda x: x%2==0, input_list)
Run Code Online (Sandbox Code Playgroud)

在 Python 3 中要小心,因为这里的 filter 只是一个生成器,所以你必须写:

filtered_list = list(filter(lambda x: x%2==0, input_list))
Run Code Online (Sandbox Code Playgroud)