Найти последовательность в ряде чисел

Дан ряд чисел от [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 шт):

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

Просто группируем последовательность в списки. Если условие сравнения с предыдущем элементом выполнено, то добавляем в тот же список. Если нет, то начинаем новый список. Потом отфильтровываем (выбрасываем) списки содержащие только один элемент.

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))
→ Ссылка