Python 列表的众数

0 投票
1 回答
824 浏览
提问于 2025-04-18 03:59

我正在尝试写一个自己的函数,用来找出一个列表中的众数,但是当列表中有多个众数时,这个函数就出问题了。有人能帮我在这个函数里加点东西,让它能处理多个众数的情况吗?提前谢谢你们!

def ModeList(nums):
    subscript = 0
    while subscript < len(nums):
        if nums.count(nums[subscript]) > nums.count(nums[subscript + 1]):
            return "The mode is " + str( nums[subscript] ) + "."
        else:
            subscript += 1

print ModeList( [2,4,6,8,6,8] )

1 个回答

4

最简单的方法是使用 collections.Counter()

from collections import Counter

def ModeList(lst):
    return Counter(lst).most_common(1)[0][0]

示例:

>>> from collections import Counter
>>> def ModeList(lst):
...     return Counter(lst).most_common(1)[0][0]
... 
>>> ModeList( [2,4,6,8,6,8] )
8

如果你需要获取所有的值,可以加上 itertools.groupby()

from collections import Counter
from itertools import groupby
from operator import itemgetter

def ModeList(lst):
    counts = Counter(lst)
    grouped = groupby(counts.most_common(), itemgetter(1))
    return [i[0] for i in next(grouped)[1]]

示例:

>>> from collections import Counter
>>> from itertools import groupby
>>> from operator import itemgetter
>>> 
>>> def ModeList(lst):
...     counts = Counter(lst)
...     grouped = groupby(counts.most_common(), itemgetter(1))
...     return [i[0] for i in next(grouped)[1]]
... 
>>> ModeList( [2,4,6,8,6,8] )
[8, 6]

如果不想导入任何东西,可以用字典来记录计数,然后按值排序:

def ModeList(lst):
    counts = {}
    for item in lst:
        counts[item] = counts.get(item, 0) + 1
    return sorted(counts, key=counts.get, reverse=True)[0]

或者对于一个列表:

def ModeList(lst):
    counts = {}
    for item in lst:
        counts[item] = counts.get(item, 0) + 1
    bycount = sorted(counts, key=counts.get)
    result = [bycount.pop()]
    while counts and counts[bycount[-1]] == counts[result[0]]:
        result.append(bycount.pop())
    return result

撰写回答