如何计算列表中最大重复次数?
如果我在Python中有一个这样的列表:
[1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]
我该如何计算列表中任何元素出现的最大次数呢?在这个例子中,数字 2
出现了最多4次,而数字 1
出现了最多3次。
有没有办法做到这一点,同时记录下最长连续出现的开始位置呢?
8 个回答
1
如果你想找出任何元素中出现次数最多的那个元素,你可以使用:
def f((v, l, m), x):
nl = l+1 if x==v else 1
return (x, nl, max(m,nl))
maxrep = reduce(f, l, (0,0,0))[2];
这个方法只计算连续出现的次数(比如对于 [1,2,2,2,1,2]
这个例子,结果会是 3
),并且只记录出现次数最多的那个元素。
编辑:把函数f的定义简化了一些……
3
遍历这个列表,记录当前的数字,以及这个数字出现了多少次,然后把这个次数和你见过的这个数字出现的最多次数进行比较。
Counts={}
Current=0
Current_Count=0
LIST = [1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1]
for i in LIST:
if Current == i:
Current_Count++
else:
Current_Count=1
Current=i
if Current_Count>Counts[i]:
Counts[i]=Current_Count
print Counts
42
使用 groupby,它可以根据值来分组元素:
from itertools import groupby
group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1])
print max(group, key=lambda k: len(list(k[1])))
下面是代码的实际运行效果:
>>> group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1])
>>> print max(group, key=lambda k: len(list(k[1])))
(2, <itertools._grouper object at 0xb779f1cc>)
>>> group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3])
>>> print max(group, key=lambda k: len(list(k[1])))
(3, <itertools._grouper object at 0xb7df95ec>)
来自Python文档的说明:
groupby()的操作方式类似于Unix中的uniq过滤器。每当关键函数的值发生变化时,它就会生成一个新的分组。
# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
如果你还想知道最长连续相同元素的索引,可以这样做:
group = groupby([1, 2, 2, 2, 2, 1, 1, 1, 2, 2, 1, 1, 3, 3, 3, 3, 3])
result = []
index = 0
for k, g in group:
length = len(list(g))
result.append((k, length, index))
index += length
print max(result, key=lambda a:a[1])