Использование 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>)
Из питона документации:
Операцию groupby() аналогичен в uniq-фильтр в Unix. Он генерирует излома или новую группу каждый время значение ключевой функции изменения
# [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])
Звучит так, что вы ищете самый длинный пробег в списке; вы можете отредактировать свой вопрос, чтобы это было ясно. – las3rjock
В частности, самый длинный пробег каждого номера – Sparr
Да, это правильно. Есть ли способ сделать это, но также записать индекс, в котором начался самый длинный запуск? – hekevintran