以下代码无法正常工作,我希望它使一个列表到一个没有元素出现两次以上的新列表。例如,将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
陈述是错误的。
答案 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)
解决方案,以解决可以在线性时间内完成的事情。
这就是为什么我在这里使用计数器的原因。