如何在python中查找数字的最大连续出现次数

时间:2018-09-20 10:22:47

标签: python

我想找出python中一个数字连续出现的最大数目。 我正在从堆栈溢出中使用以下代码。

from itertools import groupby
b= [1,2,45,55,5,4,3,2,5,5,6,5456,5456,5456,7,67,6,6]

print(b)

def occurrence():
    occurrence, num_times = 0, 0
    for key, values in groupby(b, lambda x : x):
        val = len(list(values))
        if val >= occurrence:
            occurrence, num_times =  key, val
    return occurrence, num_times

occurrence, num_times = occurrence()
print("%d occurred %d times" % (occurrence, num_times))

我得到以下答案:

5 occurred 2 times

答案应该是5456,因为它出现了3次。 任何机构都可以帮助我解决问题吗?

3 个答案:

答案 0 :(得分:2)

您唯一需要的更改是

if val >= num_times:

您的代码正在将当前组的长度与最后key的长度进行比较。

这将返回最后一个项目,该项目具有最大的连续出现次数(如果列表中的5之后出现了三次,则将其选中)。

答案 1 :(得分:2)

您可以使用内置的max函数来查找最大的num_times来简化代码。

from itertools import groupby

b = [1, 2, 45, 55, 5, 4, 3, 2, 5, 5, 6, 5456, 5456, 5456, 7, 67, 6, 6]

num_times, occurrence = max((len(list(values)), key) for key, values in groupby(b))
print("%d occurred %d times" % (occurrence, num_times))

输出

5456 occurred 3 times

没有必要给groupby这样低效的lambda x: x:如果您不给它一个键功能,则默认情况下会使用身份功能。


FWIW,有一种更有效的方法来计算groupby组的长度。这里没关系,但是当组很大时,它很方便。除了将组转换为列表并获取其长度以外,我们可以在组上循环并使用内置的sum对组中的项目进行计数。只需更改

len(list(values))

sum(1 for _ in values)

答案 2 :(得分:-1)

您可以使用以下生成器表达式:

print('{1} occurred {0} times'.format(*max((len(list(g)), k) for k, g in groupby(b))))

这将输出:

5456 occurred 3 times