代码之家  ›  专栏  ›  技术社区  ›  luciferchase

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

  •  -1
  • luciferchase  · 技术社区  · 5 年前

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

    代码:-

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

    该函数在列表的大多数部分都起作用,但如果列表的值与 [4, 5, 5, 4] [4, 5, 4] .
    我已经更改了代码以实现我所需的功能,但我只是好奇为什么会发生这种情况?

    5 回复  |  直到 5 年前
        1
  •  2
  •   Devesh Kumar Singh    5 年前

    purified = sequence 不创建的副本 sequence 并分配给 purified

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

    • sequence[:] 称为列表拼接,并对其进行迭代
    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]
    
    • filter 过滤出奇数值
    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]
    
        2
  •  2
  •   iz_    5 年前

    迭代时不应尝试移除元素。也, purified = sequence 实际上并没有创建 sequence . 最好的方法是使用这样的列表理解:

    def purify(sequence):
        purified = [i for i in sequence if i % 2 == 0]
        return purified
    
        3
  •  1
  •   gmds    5 年前

    (我本可以发誓我回答了一个骗局,但我找不到……)

    不管怎样,原因是您在迭代序列时正在修改它。你应该这样做:

    # 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
    
    

    或者,你可以从一个空的开始 list 并添加满足条件的元素:

    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]
    
        4
  •  1
  •   Rakesh    5 年前

    在python2.7上使用 copy 模块。

    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])
    
        5
  •  1
  •   P.hunter    5 年前

    通过使用

    # 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)
    

    说明:

    • 过滤器是用来测试 你的清单

    干杯!