如何返回列表中出现次数最多的元素?

时间:2016-04-09 11:43:56

标签: python list python-3.x

所以我试图创建一个函数,它将采用单个参数numlist(一个非空的数字列表),并返回在numlist中出现频率最高的数字的排序列表。

到目前为止,我已设法创建一个字典(数字作为键,其频率为值)。但我仍然想找到哪一个具有最大值并将其返回。事情是我不知道如何比较它们。现在有一些像这样的单行

max(stats, key=stats.get)

但如果满足该要求的多个值会怎么样?

mode([5, 1, 1, 5])
#I'm guessing this should return [1, 5] if sorted...

你会怎么处理?感谢您的帮助!

这是我的代码:

def mode(numlist):

    mylist = numlist
    dic = {}

    for num in mylist:
        if num in dic:
            dic[num] += 1
        else:
            dic[num] = 1
     # try to get the max value and return them in a set form like [1, 0]    

3 个答案:

答案 0 :(得分:1)

您可以使用Counter返回一个dict类似对象,其中元素存储为字典键,其计数存储为字典值。

from collections import Counter

def mode(my_list):
    ct = Counter(my_list)
    max_value = max(ct.values())
    return sorted(key for key, value in ct.items() if value == max_value)

演示:

In [46]: mode([5, 1, 1, 5])
Out[46]: [1, 5]

答案 1 :(得分:0)

您可以使用collections.Counter

printf("%s", ptrName);

如果订单很重要,请使用from collections import Counter def mode(num_list): max_value = float('-inf') maxes = None for key, value in Counter(num_list).items(): if value == max_value: maxes.add(key) elif value > max_value: max_value = value maxes = {key} return maxes print(mode([1, 3, 3, 1, 2])) 代替[key]{key}代替maxes.append(key)

答案 2 :(得分:0)

你可以使用的单线是

def mode(num_list):
    return max(num_list, key = num_list.count)

但正如你所说,它不适用于具有相同出现次数的多个数字。

我更喜欢继续使用列表而不是字典。下面的函数将返回一个列表,其中包含出现次数最多的所有数字。

def mode(num_list):

    # Make list of tuples with their values and no. occurrences
    # num_list = [5, 1, 1, 5, 5]
    # max_ocur = [(1, 2), (5, 3)]
    max_ocur = [(i, num_list.count(i)) for i in num_list]

    # Set to remove duplicates
    max_ocur = set(max_ocur)

    # Find the max number of occurrences
    m = max(max_ocur, key = lambda x: x[1])[1]

    # Get list of all numbers in max_ocur that have highest occurrence
    modes = [i for i, ocur in max_ocur if ocur == m]

    modes.sort() # Sort if you want

    return modes

或者你可以使用短版本。我不确定我更喜欢哪一个,我做了上面的一个,因为使用list.count两次感觉效率低下。但我不确定哪一个更有效率。

def mode(num_list):

    max_ocur = max([num_list.count(i) for i in num_list])

    return [i for i in set(num_list) if num_list.count(i) == max_ocur]

如果在偶数中你只有一个号码在列表中出现次数最多而你宁愿返回号码而不是只有一个号码的列表你可以做

return modes if len(modes) > 1 else modes[0]