如何在Python中生成多个模式?
基本上,我就是想知道怎么在Python中从一个列表里找出出现次数最多的数字,也就是众数。不管这个列表有没有多个众数都没关系。
像这样:
def print_mode (thelist):
counts = {}
for item in thelist:
counts [item] = counts.get (item, 0) + 1
maxcount = 0
maxitem = None
for k, v in counts.items ():
if v > maxcount:
maxitem = k
maxcount = v
if maxcount == 1:
print "All values only appear once"
if counts.values().count (maxcount) > 1:
print "List has multiple modes"
else:
print "Mode of list:", maxitem
不过,我希望它返回的不是“所有值只出现一次”或者“列表有多个众数”这样的字符串,而是我想要的那些实际的整数。
3 个回答
0
在Python 3.8的新统计模块里,有一个专门用来处理这个的函数:
import statistics as s
print("mode(s): ",s.multimode([1,1,2,2]))
输出结果:众数是:[1, 2]
1
def mode(arr):
if len(arr) == 0:
return []
frequencies = {}
for num in arr:
frequencies[num] = frequencies.get(num,0) + 1
mode = max([value for value in frequencies.values()])
modes = []
for key in frequencies.keys():
if frequencies[key] == mode:
modes.append(key)
return modes
这段代码可以处理任何列表。确保列表里的元素都是数字。
13
先创建一个 Counter
,然后找出出现频率最高的元素:
from collections import Counter
from itertools import groupby
l = [1,2,3,3,3,4,4,4,5,5,6,6,6]
# group most_common output by frequency
freqs = groupby(Counter(l).most_common(), lambda x:x[1])
# pick off the first group (highest frequency)
print([val for val,count in next(freqs)[1]])
# prints [3, 4, 6]