我试图在整数数组中找到最不常见的元素并将其删除,并以相同的顺序返回列表。
这就是我所做的,但当列表为[1, 2, 3, 4, 5]
时,我的函数应返回[]
,但会返回[2, 4]
。
def check(data):
for i in data:
if data.count(i) <= 1:
data.remove(i)
return data
data = [1, 2, 3, 4, 5]
print check(data)
答案 0 :(得分:3)
从正在迭代的列表中删除项目会导致您跳过项目(即删除每个项目后面的下一项目)。
相反,请创建一个仅包含您要保留的值的新列表。
from collections import Counter
def check(data):
ctr = Counter(data)
least = min(ctr.values())
return [d for d in data if ctr[d] > least]
答案 1 :(得分:1)
在迭代它时,不应该修改(特别是删除)列表中的元素。
发生的事情是:
d.count(1)
为1,因此您从列表中删除1。d.count(3)
为1,因此您将其删除为列表[2,4,5] 您的算法应该:
答案 2 :(得分:0)
您不应该检查data.count(i) <= 1
。在这种情况下会发生什么:[1, 1, 2, 2, 3, 3, 3]
? 1
和2
是最不常见的元素,但您永远不会删除它们。同样,在for
循环中改变列表也是一个坏主意。
您可以做的一件事是使用Counter
class。
most_common()
方法的尾部取一个适当的片段(当你沿着列表向下时,它们的条目得到 less 频繁,所以这就是为什么你采取尾巴而不是头)。答案 3 :(得分:0)
另一个尝试:
def check(data):
ctr = Counter(data)
keys = ctr.keys()
vals = ctr.values()
least = []
m = min(vals)
for i in range(0,len(vals)):
if vals[i] == m:
least.append(keys[i])
print least
data = [1, 2, 3, 4, 5,1]
result = check(data)