我有两个interger列表:
A = [1,2,3,5,2,3]
B = [1,2,3,5,2,3,5]
我想使用most_common来获得与此类似的最高统计:列表[(2, 2), (3, 2)]
的{{1}}和列表A
的{{1}}。我怎么能这样做?
答案 0 :(得分:2)
一种低效的方法是使用collections.Counter
,然后使用字典理解。请记住,Counter
会返回一个字典,可以像其他字典一样进行操作。
from collections import Counter
A_c = Counter(A)
B_c = Counter(B)
A_res = [(k, v) for k, v in A_c.items() if v == max(A_c.values())]
# [(2, 2), (3, 2)]
B_res = [(k, v) for k, v in B_c.items() if v == max(B_c.values())]
# [(2, 2), (3, 2), (5, 2)]
第三方库numpy
提供了更有效的解决方案。在这里,您可以从连续内存块中保存计数中受益。
import numpy as np
def max_counter(lst):
values, counts = np.unique(lst, return_counts=True)
idx = np.where(counts == counts.max())[0]
return list(zip(values[idx], counts[idx]))
第三种解决方案将itertools.groupby
与collections.Counter
结合起来。您应该测试哪种方法适用于您的数据。
from collections import Counter
from itertools import groupby
from operator import itemgetter
def max_counter_grp(lst):
grouper = groupby(Counter(lst).most_common(), key=itemgetter(1))
return max((list(j) for _, j in grouper), key=lambda x: x[0][1])