Python 为什么我的列表只删除两个或多个相同值中的一个?

Python 为什么我的列表只删除两个或多个相同值中的一个?,python,python-2.7,Python,Python 2.7,我做了这个函数,从列表中删除所有奇数。我无法修改原始列表 代码:- def纯化序列: 纯化=序列 就我而言: 如果我是%2!=0: 雷莫维 回流净化 该函数适用于大多数列表,但如果列表具有与[4,5,5,4]相同的值,则返回[4,5,4]。 我已经更改了代码以达到我的要求,但我只是好奇为什么会发生这种情况?我可以发誓我回答了一个重复的问题,但我找不到它 无论如何,原因是您在迭代序列时正在修改序列。您应该这样做: # Python 3 def purify(sequence): purif

我做了这个函数,从列表中删除所有奇数。我无法修改原始列表

代码:-

def纯化序列: 纯化=序列 就我而言: 如果我是%2!=0: 雷莫维 回流净化 该函数适用于大多数列表,但如果列表具有与[4,5,5,4]相同的值,则返回[4,5,4]。
我已经更改了代码以达到我的要求,但我只是好奇为什么会发生这种情况?

我可以发誓我回答了一个重复的问题,但我找不到它

无论如何,原因是您在迭代序列时正在修改序列。您应该这样做:

# Python 3
def purify(sequence):
    purified = sequence.copy()
    for i in sequence:
        if i % 2 != 0:
            purified.remove(i)

    return purified

# Python 2
from copy import copy

def purify(sequence):
    purified = copy(sequence)
    for i in sequence:
        if i % 2 != 0:
            purified.remove(i)

    return purified

或者,您可以从空列表开始,添加满足条件的元素:

def purify(sequence):
    purified = []
    for i in sequence:
        if i % 2 == 0:
            purified.append(i)

    return purified
或者,通过列表理解,这是:

purified = [i for i in sequence if i % 2 == 0]

迭代时不应尝试删除元素。此外,purified=sequence实际上并不创建序列的副本。最好的方法是使用如下列表:

def purify(sequence):
    purified = [i for i in sequence if i % 2 == 0]
    return purified
Purprized=sequence不会创建sequence的副本并分配给Purprized,而是两个变量都指向同一个对象,您正试图这样做。此外,您还修改了正在迭代的同一个列表,因此出现了奇怪的行为

您有几个选择,所有这些选择都适用于Python2.7

通过名为列表拼接的序列[:]复制序列,并对其进行迭代 使用列表理解仅从列表中选取偶数值 使用过滤器过滤掉奇数值 在python2.7上使用复制模块

例:

通过使用过滤器

说明:

lambda是一个单行匿名函数,如果数字为偶数,则返回。 过滤器是对您的_列表的真实性的测试
干杯

我尝试了第一种方法,它抛出了以下错误AttributeError:“list”对象没有属性“copy”,很抱歉,但为什么for缩进?@Lucifer,这不对。尝试重新启动shell。缩进是一个错误,修正了。我尝试了这个打印purify[4,5,5,4],它给出了那个错误。你能解释一下为什么吗?@Lucifer对我来说很好。我相信您正在使用Python 2。我将编辑我的答案,其他两种方法应该有效。可能重复
def purify(sequence):

    #Iterate on copy of sequence
    for i in sequence[:]:
        if i % 2 != 0:
            sequence.remove(i)
    return sequence

print purify([4, 5, 5, 4])
#[4, 4]
def purify(sequence):

    #Pick only even values
    return [item for item in sequence if item%2 == 0]

print purify([4, 5, 5, 4])
#[4, 4]
def purify(sequence):
    # Iterate on copy of sequence
    return list(filter(lambda x:x%2==0, sequence))

print(purify([4, 5, 5, 4]))
# [4, 4]
from copy import copy

def purify(sequence):
    purified = copy(sequence)
    for i in sequence:
        if i % 2 != 0:
            purified.remove(i)

    return purified
print purify([4, 5, 5, 4])
# python 2.x
your_list= filter(lambda x: x % 2 == 0, your_list)

# python 3.x
your_list = list(filter(lambda x: x % 2 == 0, your_list))

print(your_list)