Я хочу узнать максимальное количество последовательных вхождений числа в 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 раза. Может ли любой орган помочь мне решить проблему?
единственное изменение, в котором вы нуждаетесь, - это
if val >= num_times:
ваш код сравнивает длину текущей группы с последним key
.
это возвращает последний элемент с максимальным последовательным вхождением (если в списке было три раза 5
позже, это будет выбрано).
Вы можете упростить этот код, используя встроенную функцию 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)
Вы можете использовать следующее выражение генератора:
print('{1} occurred {0} times'.format(*max((len(list(g)), k) for k, g in groupby(b))))
Эти результаты:
5456 occurred 3 times