如果条件为python

时间:2018-08-28 09:10:04

标签: python list

以下代码无法正常工作,我希望它使一个列表到一个没有元素出现两次以上的新列表。例如,将l = [3, 3, 3, 5, 9]修改为[3, 3, 5, 9]。这是我的代码:

l = [3, 3, 3, 5, 9]
bl = []

for i in l:
    if l.count(i) > 2:
        l.remove(i)
    else:
        bl.append(i)
print(l)
print(bl)

其输出:

  

[3、3、5、9]
  [3,5,9]

正确修改了列表l,而新列表bl与我预期的不一样。我认为我的if陈述是错误的。

3 个答案:

答案 0 :(得分:2)

您正在遍历列表时对其进行修改,请创建副本来解决该问题:

l = [3,3,3,5,9]
bl = []

for i in l[::]:
    if l.count(i) > 2:
        l.remove(i)
    else:
        bl.append(i)
print(l)
print(bl)

您在这里有一个live example

答案 1 :(得分:1)

我认为您不应该关心当前元素在源列表中有多少次,但是如果它已经在目标列表中已经两次了

l = [3,3,3,5,9]
bl = []

for i in l:
    if bl.count(i) < 2:
        bl.append(i)
print(l)
print(bl)

#[3, 3, 3, 5, 9]
#[3, 3, 5, 9]

答案 2 :(得分:0)

使用collections.Counter

from collections import Counter
l = [3,3,3,5,9]

c = Counter(l)
l_new = [k for k,v in c.items() for _ in range(min(v,2))]

#[3, 3, 5, 9]

请注意,通过对列表中的每个元素使用count(),您将得到O(n**2)解决方案,以解决可以在线性时间内完成的事情。
这就是为什么我在这里使用计数器的原因。