如何计算列表中最大重复次数?

10 投票
8 回答
6091 浏览
提问于 2025-04-15 11:42

如果我在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])

撰写回答