Python:计算列表中项的最大出现次数,允许并列

3

目前,我正在使用经典的列表元素计数方法max(lst,key=lst.count)。但是,如果两个不同元素的最大出现次数相等,例如 lst = [1,1,2,2]max 函数只返回一个元素。在我们的例子中,它将返回 12。但我需要一个函数可以同时返回 12


1
这个回答解决了你的问题吗?[使用Python的max函数返回两个相等的值] (https://dev59.com/cmkw5IYBdhLWcg3wfKrZ) - Mady Daby
请查看此链接:(https://dev59.com/-Ww05IYBdhLWcg3w3VaX) - Rima
4个回答

3

从列表中构建一个Counter,并使用列表推导式获取匹配最高计数的项目:

from collections import Counter

lst = [1,1,2,2]

c = Counter(lst)
maximums = [x for x in c if c[x] == c.most_common(1)[0][1]]
print(maximums)
# [1, 2]

计数器(Counter)方法在一次遍历中完成计数(O(n)),而列表的count方法(list.count)则具有O(n^2)的时间复杂度,因为每次调用都要经过列表。

1
这可能不是最优雅的解决方案,但它绝对有效。首先找到最大出现次数的数字,然后找到具有该计数的元素。
lst = [1,1,2,2,3,4]
max_count = max([lst.count(i) for i in set(lst)])
max_count_values = [i for i in set(lst) if lst.count(i)==max_count]

1
这个程序的时间复杂度为O(n^2),因为它在循环中反复使用了list.count - Moses Koledoye
正如所述,我的解决方案并不是最优雅的,因此我的解决方案也不是最佳的并不令人惊讶。但我认为,对于初学者来说,我的解决方案最容易理解,同时也不需要安装/使用任何模块,这一点可以弥补它的不足。 - Anthony Lam

1

这是一个很好的问题,因为使用 scipy.stats.mode 找到列表中最常见的单个数字是微不足道的,但如果您想找到所有不同的模式,则没有什么简单的方法。

对于每个值调用 list.count 是不必要的昂贵的,因为这需要 O(n^2) 时间,但计算每个元素的计数只需要 O(n) 时间。

以下是使用 NumPy 的解决方案:

>>> import numpy as np
>>> lst = [1,1,2,2,3]
>>> values, counts = np.unique(lst, return_counts=True)
>>> values[np.argwhere(counts == counts.max())].flatten()
array([1, 2])

0
一行代码,但可能不是最清晰的。
set(x for x in lst if lst.count(x)==max(lst.count(x) for x in lst))

这个程序的时间复杂度至少是二次方的,甚至可能是三次方的。 - Andrew Eckart

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