如何在列表中找到与count相同的最常见值

时间:2018-05-22 08:32:50

标签: python list

我有两个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}}。我怎么能这样做?

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.unique

第三方库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]))

Counter + groupby

第三种解决方案将itertools.groupbycollections.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])