Вывести самую длинную последовательность (в списке python)

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

Например, вводим 1 2 7 12 4 5 6 8 7 5 4 2 1 11 13 Должны получить в ответе: 8 7 5 4 2 1

Например, вводим 1 2 7 12 4 5 6 8 7 5 4 2 1 11 13 14 17 21 33 34 Должны получить в ответе: 1 11 13 14 17 21 33 34

Например, вводим 1 2 5 5 5 4 3 2 Должны получить в ответе: 5 5 5 4 3 2

То есть рассматривается как возрастающая так и убывающая последовательность, с повторяющимися символами


Ответы (2 шт):

Автор решения: MBo

Взяли стартовый индекс. Начали идти дальше. Если знак разности с предыдущим числом меняется - остановились, посчитали разницу со стартовым индексом, если она больше текущего максимума - запомнили. Взяли предыдущий индекс за старт и продолжаем.

→ Ссылка
Автор решения: DanBear

Я не изучаю Python, так что сразу извиняюсь за плохой код или что-то ещё, но если я правильно понял задачу, то это её решение:

def getLargestSequence (list, comparator):
  largestSequence = []

  for i in range (0, len (list) - 1):
    currentSequence = [list[i]]

    for y in range (i + 1, len (list)):
      if comparator (list[y], currentSequence[len (currentSequence) - 1]):
        currentSequence.append (list[y])
      else:
        break

    if len (currentSequence) > len (largestSequence):
      largestSequence = currentSequence

  return largestSequence


inputList = [int (x) for x in input ().split ()]

list2 = getLargestSequence (inputList, lambda x, y: x >= y)
list3 = getLargestSequence (inputList, lambda x, y: x <= y)

print (list2 if len (list2) >= len (list3) else list3);

В первом цикле метода getLargestSequence мы берём стартовый индекс для последовательности, дальше, во втором цикле, мы перебираем числа, которые стоят после стартового индекса и если они удовлетворяют условие (больше или меньше), то добавляются в новую последовательность. И так каждый цикл. В конце возвращаем наибольшую из этих последовательностей.

Вариант без двойного цикла:

def getLargestSequence (list, comparator):
  largestSequence = []
  currentSequence = [list[0]]

  for i in range (1, len (list)):
    if comparator (list[i], currentSequence[len (currentSequence) - 1]):
      currentSequence.append (list[i])
    else:
      if len (currentSequence) > len (largestSequence):
        largestSequence = currentSequence

      currentSequence = [list[i]]

  if len (currentSequence) > len (largestSequence):
    largestSequence = currentSequence

  return largestSequence


inputList = [int (x) for x in input ().split ()]

list2 = getLargestSequence (inputList, lambda x, y: x >= y)
list3 = getLargestSequence (inputList, lambda x, y: x <= y)

print (list2 if len (list2) >= len (list3) else list3);

Тут в одном цикле перебираются все числа и вместе с этим создаётся последовательность, которая проверяется на длину (и заменяет собой largestSequence, если надо) и обнуляется, если следующее число не подходит.

→ Ссылка