Найти самую длинную последовательность, упорядоченную по возрастанию (Python)

Тема: 
Списки, кортежи

В списке чисел найти самую длинную последовательность, которая упорядочена по возрастанию. Если таких последовательностей несколько (с одинаковой максимальной длинной), то найти их все. Вывести на экран сам список, длину самой длинной упорядоченной по возрастанию последовательности, саму последовательность (или несколько).

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

Для того, чтобы найти длину, в цикле очередной элемент сравнивается с предыдущим (цикл начинается со второго элемента). Если очередной элемент больше, то переменная l увеличивается на 1. Иначе l сравнивается с ранее найденной максимальной длиной (lmax). Если l больше, то lmax перезаписывается на ее значение. Независимо от того, больше l чем lmax или нет, ей присваивается единица.

После того как длина самой длинной упорядоченной последовательности найдена, ищутся сами последовательности. Для этого список снова перебирается, начиная со второго элемента, и снова считается длина текущей упорядоченной последовательности (l). Если очередной элемент уже не входит в упорядоченную последовательность, а l равна lmax, то значит, на предыдущем элементе закончилась самая длинная последовательность. Для ее вывода используется взятие среза. Он берется от i-l до i (текущий элемент не входит в срез).

from random import random
N = 20
a = [0] * N
for i in range(N):
    a[i] = int(random()*50)
print(a)
 
lmax = l = 1
for i in range(1,N):
    if a[i] > a[i-1]:
        l += 1
    else:
        if l > lmax:
            lmax = l
        l = 1
print(lmax)
 
l = 1
for i in range(1,N):
    if a[i] > a[i-1]:
        l += 1
    else:
        if l == lmax:
            print(a[i-l:i])
        l = 1

Примеры выполнения программы:

[18, 20, 29, 9, 3, 0, 21, 23, 2, 19, 34, 11, 18, 24, 27, 31, 49, 48, 0, 42]
6
[11, 18, 24, 27, 31, 49]
[11, 45, 13, 41, 48, 38, 38, 8, 36, 17, 43, 10, 10, 5, 46, 27, 32, 35, 7, 28]
3
[13, 41, 48]
[27, 32, 35]

проще нарезать списки

проще нарезать списки, разделяя основной список, и максимальную последовательность определять по его длине:

from random import randint
 
N = 20
a = [randint(0,99) for _ in range(N)]
 
lists = [[]]
old = -1
 
for i in a:
    if i < old:
        lists.append([])
    old = i
    lists[-1].append(i)

и потом уже получать хоть длину, хоть сами списки:

print (lists)
# полученный список
 
lmax = max(len(i) for i in lists)
print (lmax)
# максимальная длина
 
for i in [_ for _ in lists if len(_) == lmax]:
    print (i)
# списки, соответствующие этой длине