从列表中删除奇数

时间:2016-06-16 18:25:00

标签: python

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

    print y

当我通过列表(4,5,5,4)时,以下代码失败。它返回(4,5,4)而不是(4,4)。这有什么不对?我无法理解为什么y列表中的更改会影响原始列表ls。

4 个答案:

答案 0 :(得分:1)

这样做。

In [1]: a = (4, 5, 5, 4)
In [2]: result = [i for i in a if not i % 2]
In [3]: result
Out[1]: [4, 4]

在功能上。

def purify(ls):
   return [i for i in ls if not i % 2]

要了解更多我扩展我的代码。从这里你可以理解它是如何工作的。

def purify(input_list):
    result = []
    for i in input_list:
        if not i % 2:
            result.append(i)
    return result

答案 1 :(得分:1)

一旦开始删除项目,索引就会更改。当你在循环中改变它的项目时,迭代列表并不是一个好习惯。迭代列表ls[:]切片

def purify(ls):
    for i in ls[:]:
        if i % 2 != 0:
            ls.remove(i)

或者只使用列表理解:

[i for i in ls if i % 2 == 0]

答案 2 :(得分:0)

以下代码更清晰,更易于理解:

l = [4, 5, 5, 4]

l = filter(lambda x: x % 2 == 0, l)

print(l)

[4, 4]

答案 3 :(得分:0)

remove(...)
    L.remove(value) -- remove first occurrence of value.
    Raises ValueError if the value is not present.

正确的版本:

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

您的正确版本:

def purify(ls):
    y = ls[:]  # copy it instead of refering to it
    for i in ls:
        if i % 2 != 0:
            y.remove(i)  # remove will return none

    print y