Как найти максимальное число последовательных вхождений числа в python

1

Я хочу узнать максимальное количество последовательных вхождений числа в 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 раза. Может ли любой орган помочь мне решить проблему?

  • 0
    Что делать, если у вас есть более одного элемента с максимальным количеством вхождений?
Теги:

3 ответа

2
Лучший ответ

единственное изменение, в котором вы нуждаетесь, - это

if val >= num_times:

ваш код сравнивает длину текущей группы с последним key.

это возвращает последний элемент с максимальным последовательным вхождением (если в списке было три раза 5 позже, это будет выбрано).

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)
0

Вы можете использовать следующее выражение генератора:

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

Эти результаты:

5456 occurred 3 times
  • 3
    Можете ли вы также объяснить этот большой один вкладыш. Это помогает, иначе это просто решение без объяснения причин и имеет ограниченную возможность переноса на другие подобные проблемы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню