Вычеслить самую длинную убывающую последовательность в списке
Изучаю python вторую неделю . Столкнулся с проблемой что нужно найти такую вот последовательность (например список [41, 15, 9, 62, 23] нужно что-бы вывело [41, 15, 9]). Ну для начала нужно создать список из которого и будет искаться последовательность.
import random
spysok = random.sample(range(1, 100), 20)
дальше нужно создать что-то на подобии списка который и будет самой длинной последовательностию
largest = []
Дальше нужно сделать цикл который как-бы будет сравнивать элемент а1 и а2, если а а2 меньше а 1, то нужно скорее всего в новый список например now = [0] добавить это и продолжить сравнивать уже а2 и а3 и тд. если а1 например будет меньше а2, то оборвать и начинать перебирать пока следующий элемент не будет меньше пердыдущего. И вот вся проблема в том что не до конца понимаю как это реализовать
Ответы (3 шт):
Это далеко не самое быстрое решение, так как тут я бестолково добавляю элементы в список и проверяю длину. Можно работать только с индексами элементов, если нужна скорость.
import random
a = random.sample(range(1, 100), 20)
print(a)
temp = []
result = []
for i in range(0, len(a) - 1):
if a[i + 1] < a[i] and len(temp) == 0:
temp.append(a[i])
temp.append(a[i + 1])
elif a[i + 1] < a[i] and len(temp) != 0:
temp.append(a[i + 1])
else:
if len(result) < len(temp):
result = temp
temp = []
else:
temp = []
if len(result) < len(temp):
print(temp)
elif len(result) == 0 and len(temp) == 0:
print([a[0]])
else:
print(result)
Вот человек тут получше сделал. Но я же не зря наклепал) Держите мой код)
spysok=[32,1,31,312,13,31,342,52,12,4,144,41,40]
def largest(spysok):
largests = [] #список всех убывающих последовательностей
is_first=True #проверяет первые ли аргумент, дабы узнать добавлять сразу два элемента, или только последний(
# т.к. первый уже был бы добавлен)
id_of_list=0 #айди нынешнего убывающего листа, чтобы узнать куда добавлять
for i in range(len(spysok)-1):
if spysok[i]>spysok[i+1]:
if is_first:
is_first=False
largests.append([spysok[i],spysok[i+1]])
else:
largests[id_of_list].append(spysok[i+1])
else:
if not is_first: #изменяем его айди, только если было добавлено хоть что-то, иначе будет за границей
id_of_list+=1
is_first=True #изменяем обратно, чтобы сделать проверку будем добавлять сразу два элемента, или один
return largests
longest_len=0
longest_list=0
for i in largest(spysok):
if len(i)>longest_len:
longest_len=len(i)
longest_list=i
print(longest_list)
Еще вариант. Сначала создаем список из индексов списка чисел, индексы берутся для тех элементов которые нарушают убывающую последовательность(с них же начинается последовательность) и вычисляем длину от одного такого элемента до другого. Также в этот список добавляются 0 и последний индекс равный длине списка чисел - они являются вспомогательными. Затем вычисляем длину от одного индекса до другого, таким образом находим максимальную убывающую последовательность.
import random
def get_desc_seq(a):
b = [i for i,x in enumerate(a) if a[i-1] < x]
b.append(len(a))
b.insert(0,0)
b = max((x-b[i-1],x) for i,x in enumerate(b))
return a[b[1]-b[0]:b[1]] if b[0] > 1 else []
a = random.sample(range(1, 100), 20)
print(a)
print(get_desc_seq(a))