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

Arj*_*van 4 python list frequency max

我有一个这样的列表:

lst = [1, 3, 5, 1, 5, 6, 1, 1, 3, 4, 5, 2, 3, 4, 5, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我想找到最常出现的所有元素.所以我想:

most = [1, 3, 5]
Run Code Online (Sandbox Code Playgroud)

1,3和5会发生最多,这是4次.什么是快速,pythonic方式来做到这一点?我试过这里显示的方法:

如何找到列表中最常见的元素?.

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

Mos*_*oye 10

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]
Run Code Online (Sandbox Code Playgroud)

您可以通过使用max计数器值来推广具有最高计数的值:

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

对于大型iterables,以有效地通过计数器进行迭代,并停止一旦已采取所需物品,你可以使用itertools.takewhilemost_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]
Run Code Online (Sandbox Code Playgroud)

你不必迭代计数器对象中的所有项目就可以获得,尽管有一些开销需要使用对项目进行排序most_common ; 所以我敢肯定,这毕竟是绝对有效的.你可以用timeit做一些实验.