如何在列表中找到出现最频繁的几个元素

3
我的下面的程序可以找到列表中出现最频繁的元素:
numbers = [7, 1, 7, 9, 2, 9, 7, 3, 0]
counter = []

for num in range(10):
    n = numbers.count(num)
    counter.append(n)

largest = max(counter)
print(counter.index(largest))

输出结果为7,是正确的。

但是,如果我将另一个9添加到列表中:

numbers = [7, 1, 7, 9, 2, 9, 7, 3, 0, 9]

这意味着在列表中有两个最常见元素(在这种情况下,7和9都出现了三次,如上所示),但它只打印其中一个 - 在这种情况下为7。
是否有任何方法可以更改我的代码,以便输出正确?
5个回答

6

以下是一种适用于任何类型数据的解决方案,不仅适用于预先已知范围内的正整数。

我们使用 collections.Counter 进行计数,提取最大计数(即最常见数字的计数),然后制作一个具有相同计数的数字列表:

from collections import Counter

numbers = [7, 1, 7, 9, 2, 9, 7, 3, 0, 9]
counts = Counter(numbers)
max_count = counts.most_common(1)[0][1]
out = [value for value, count in counts.most_common() if count == max_count]
print(out)
# [7, 9]

1
for num in range(10):
    if counter[num] == largest:
        print(num)

0

由于列表counter的索引反映了一个排序后的值列表,一个简单的解决方案是取最高的索引:len(counter) - 1 - counter[::-1].index(largest)


0
from itertools import groupby

numbers = [7, 1, 7, 9, 2, 9, 7, 3, 0, 9]

counts = [(i, len(list(c))) for i,c in groupby(numbers)]    
print(counts)

groupby提供了相同键的运行。您可以对列表进行排序,然后使用此方法。您提供的代码的输出是[(7, 1), (1, 1), (7, 1), (9, 1), (2, 1), (9, 1), (7, 1), (3, 1), (0, 1), (9, 1)]。您还没有回答OP的问题,只是展示了一个(可能令人困惑的)key,count列表,而没有解释它是如何工作的或者OP应该如何处理它。 - Ryan Haining

0

这是我的方法:

numbers = [7, 1, 7, 9, 2, 9, 7, 3, 0, 9]
counter = set([x for x in numbers if numbers.count(x) > 1])
print(max(counter))
# 9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接