查找频率最高的所有元素的 Pythonic 方法?

标签 python list max frequency

<分区>

我有一个这样的列表:

lst = [1, 3, 5, 1, 5, 6, 1, 1, 3, 4, 5, 2, 3, 4, 5, 3, 4]

我想找到所有 出现频率最高的元素。 所以我想:

most = [1, 3, 5]

1、3、5出现次数最多,共4次。什么是快速的 pythonic 方法来做到这一点?我尝试了此处显示的方法:

How to find most common elements of a list? .

但它只给了我前 3 名,我需要所有元素。谢谢。

最佳答案

collections.Counter和一个列表理解:

from collections import Counter

lst = [1, 3, 5, 1, 5, 6, 1, 1, 3, 4, 5, 2, 3, 4, 5, 3, 4]
r = [x for x, _ in Counter(lst).most_common(3)]
print(r)
# [1, 3, 5]

您可以通过在计数器值上使用 max 来概括具有最高计数的值:

c = Counter(lst)
m = max(c.values())
r = [k for k in c if c[k] == m]
print(r)
# [1, 3, 5]

对于大型可迭代对象,要有效地遍历计数器并在获取所需项目后停止,您可以使用 itertools.takewhile most_common 没有任何参数:

from itertools import takewhile

c = Counter(lst)
m = max(c.values())
r = [x for x, _ in takewhile(lambda x: x[1]==m, c.most_common())] 
print(r)
# [1, 3, 5]

虽然必须使用 most_common 对项目进行排序会产生一些开销,但您不必遍历计数器对象中的所有项目,从而获得好处;所以我确定这是否绝对终究是有效的。你可以用 timeit 做一些实验.

关于查找频率最高的所有元素的 Pythonic 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42322331/

相关文章:

python - 在 Numpy 数组的行或列之间进行插值

java - 一种在运行时查找另一个对象(其中包含列表)的所有子对象的方法

mysql 按天分组并计数,然后仅过滤每天的最高值

android - 在 SeekBar 中无法选择最大值

python - 来自元组的值与 Python 中的用户输入命名相同(我很难解释,如果我能找到更好的表达方式,我会更新标题)

python - 如何在 Keras 中从 HDF5 文件加载模型?

Python:创建一个新列表,其中包含已排序的嵌套列表中的所有元素

python - 在python中选择满足条件的索引

prolog - 查找 prolog 程序给出错误结果的查询

python - Pandas:根据目标分布从 DataFrame 中采样