Python:计算列表中某个项目的最大出现次数,允许有联系

Python: Counting maximum occurences of an item in a list with ties allowed

现在我正在使用经典的列表计数 max(lst,key=lst.count) 但如果两个不同元素的最大出现次数相同,例如 lst = [1,1,2,2]max return 只有一个元素。在我们的示例中,它将 return 12 。但是我需要一个 return 12.

的函数

这可能不是最优雅的解决方案,但绝对有效。首先找到最大出现的次数,然后找到具有该次数的元素。

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]

从列表中构建一个 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)) 中进行计数,而 list.count 方法在每次调用通过列表时具有 O(n^2) 时间复杂度。

问得好,因为使用 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])

一行,但可能不是最清楚的。

set(x for x in lst if lst.count(x)==max(lst.count(x) for x in lst))