Найти последовательность в ряде чисел
Дан ряд чисел от [1 до 100] [34,12,87,6,54,5,67,34,76,78,78] надо выявить последовательно когда подряд идет больше/меньше 50. то есть когда идет подряд больше 50, меньше 50, больше 50, меньше 50 и если идет повторение больше 50, больше 50 или меньше 50, меньше 50, тогда ответ False и ряд сбивается.
def analis_upper_50_less(list: list):
upper_under_counter = 0
upper_under = False
upper_50 = 1
under_50 = 1
if len(list) > 2:
for num in list:
if num > 50 and under_50 == 1:
upper_50 = 1
print("upper_50 = " + str(upper_50))
under_50 = 0
print("under_50 = " + str(under_50))
upper_under = True
print("upper_under = " + str(upper_under))
upper_under_counter = upper_under_counter + 1
print("upper_under_counter = " + str(upper_under_counter))
if num < 50 and upper_50 == 1:
upper_50 = 0
print("upper_50 = " + str(upper_50))
under_50 = 1
print("under_50 = " + str(under_50))
upper_under = True
print("upper_under = " + str(upper_under))
upper_under_counter = upper_under_counter + 1
print("upper_under_counter = " + str(upper_under_counter))
if num > 50 and under_50 != 1:
upper_50 = 1
print("upper_50 = " + str(upper_50))
under_50 = 1
print("under_50 = " + str(under_50))
upper_under = False
print("upper_under = " + str(upper_under))
upper_under_counter = 0
print("upper_under_counter = " + str(upper_under_counter))
clear_results_upper_50_less_50()
if num < 50 and upper_50 != 1:
upper_50 = 1
print("upper_50 = " + str(upper_50))
under_50 = 1
print("under_50 = " + str(under_50))
upper_under = False
print("upper_under = " + str(upper_under))
upper_under_counter = 0
print("upper_under_counter = " + str(upper_under_counter))
clear_results_upper_50_less_50()
print(list)
Я попытался это сделать через проверку условия какое число был прежде. Но пока что не могу доработать.
Возможно, есть уже какие-то готовые инструменты или библиотека, которые бы могли по заданным характеристикам выискивать последовательности.
Ответы (1 шт):
Просто группируем последовательность в списки. Если условие сравнения с предыдущем элементом выполнено, то добавляем в тот же список. Если нет, то начинаем новый список. Потом отфильтровываем (выбрасываем) списки содержащие только один элемент.
def get_sequences(seq):
res = []
sub_seq = seq[:1]
for el in seq[1:]:
if sub_seq[-1] < 50 < el or sub_seq[-1] > 50 > el:
sub_seq.append(el)
else:
res.append(sub_seq)
sub_seq = [el]
res.append(sub_seq)
print("Группы:", res)
return list(filter(lambda x: len(x) > 1, res))
data = [85, 60, 55,1,98,3,77,22, 11, 34,66,12,87,6,54,5,67,34,76, 78, 99, 78,4,78,3,67]
print("Результат:", get_sequences(data))
В результате найдутся все последовательности удовлетворяющие условию.
Группы: [[85], [60], [55, 1, 98, 3, 77, 22], [11], [34, 66, 12, 87, 6, 54, 5, 67, 34, 76], [78], [99], [78, 4, 78, 3, 67]]
Результат: [[55, 1, 98, 3, 77, 22], [34, 66, 12, 87, 6, 54, 5, 67, 34, 76], [78, 4, 78, 3, 67]]
Процедуру можно оформить чуть компактнее, без переменной содержащей промежуточный список. Но так, как мне кажется, чуть менее наглядно, что за алгоритм применён.
def get_sequences(seq):
res = [seq[:1]] # начинаем новый список и кладём в него первый элемент (с индексом 0)
for el in seq[1:]: # идём по элементам начиная со второго (с индекса 1)
if res[-1][-1] < 50 < el or res[-1][-1] > 50 > el:
res[-1].append(el) # продолжаем предыдущий список
else:
res.append([el]) # начинаем новый список
print("Группы:", res)
return list(filter(lambda x: len(x) > 1, res))