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