Подсчитайте самую длинную строку повторяющихся чисел в списке целых чисел python

#python #arrays #algorithm

#python #массивы #алгоритм

Вопрос:

У меня есть списки целых чисел, такие как mylist = [40,46,46,50,50,54,54,67,75,75,79,79,87...

Списки строго увеличиваются, где, если число повторяется, оно повторяется только один раз (например 46 , в ..40,46,46,50.. ), и различия между продолжающимися повторениями всегда одинаковы (например, для mylist его 4 ..40,46,46,50,50,54,54.. , потому что 50-46 = 4 , 54-50 = 4 и так далее).

Я хотел бы узнать самую длинную полосу этого шаблона удвоения. Например, для этой части есть две строки (), где повторяющаяся строка равна 3, и (), где повторяющаяся строка равна 2 . mylist 46,46,50,50,54,54 75,75,79,79

У меня есть разные списки, в которых различия могут меняться (может быть 4 или 5 или 6), но этот шаблон удвоения и увеличения не меняется.

Как я могу найти самую длинную повторяющуюся строку (например, 3 mylist )? Я не мог найти краткое и простое решение без использования большого количества циклов for и условий if.

Ответ №1:

Вы могли бы использовать groupby дважды, а затем max с len в качестве key :

 from itertools import groupby
from operator import itemgetter

mylist = [40, 46, 46, 50, 50, 54, 54, 67, 75, 75, 79, 79, 87]

groups = ((k, sum(1 for _ in v)) for k, v in groupby(mylist))

streaks = [list(v) for k, v in groupby(groups, key=itemgetter(1)) if k == 2]

result = max(streaks, key=len)
print(result)
  

Вывод

 [(46, 2), (50, 2), (54, 2)]
  

Первая итерация группирует числа в последовательных равных значениях, вторая делает это по размеру строки, наконец, max просто извлекает самую большую из этих групп.

Если вы хотите распаковать результат, просто выполните:

 print([n for n, count in result for _ in range(count)])
  

Вывод

 [46, 46, 50, 50, 54, 54]
  

Комментарии:

1. print(len(result)) это то, что мне было нужно, но таким образом у меня есть больше информации, спасибо!!

Ответ №2:

Вы можете сделать это следующим образом:

 from itertools import groupby

aux = [sum(1 for _ in b) for a,b in groupby(mylist)]
aux2 = [sum(1 for _ in b if a != 1) for a,b in groupby(aux)]
consecutive = max(aux2)
print(consecutive)
  

Вывод

 3
  

Где последовательное — это значение, которое вы ищете. Повторяя одну и ту же операцию дважды, она сначала преобразует ваш список в список целых чисел, где каждое повторяющееся значение теперь представлено как 2:

 print(aux)
[1,2,2,2,1,1,1,...]
  

Затем он делает то же самое, если значение не равно 1, поэтому второй список теперь:

 print(aux2)
[1,3,...]
  

И затем вы возвращаете максимальное значение этого списка.