Как получить локальный мин в списке? - PullRequest
2 голосов
/ 14 июля 2020

Может ли кто-нибудь предложить способ получения локального минимума в списке?

Например, у меня есть список [50, 50, 49, 49, 49, 50, 50, 50, 49, 49, 49, 48, 48, 48, 47, 47, 48, 48, 13, 12, 11, 10, 11, 12].

Я хочу получить ответ [49, 47, 10], и индекс.

Я пробовал, но получил ответ вроде [49, 50, 47, 48, 10, 11, 12].

Может ли кто-нибудь помочь мне изменить код?

Большое спасибо.

for i in range(len(list)):
    if (i != 0) & (i+1 != len(list)):
        if (list[i] == list[i + 1]):
            repeat += 1
        elif (list[i] < list[i - 1]):
            repeat = 1
            continue
        elif (list[i] < list[i + 1]):
            group_list.append(list[i])

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Вы можете l oop просмотреть список и найти места, где он изменяется от уменьшения к увеличению.

def local_minima(lst):
    mins = []
    decreasing = True
    for i in range(len(lst) - 1):
        a = lst[i]
        b = lst[i + 1]
        if not decreasing and b < a:
            decreasing = True
        elif decreasing and b > a:
            mins.append(a)
            decreasing = False
    return mins
>>> local_minima([50, 50, 49, 49, 49, 50, 50, 50, 49, 49, 49, 48, 48, 48, 47, 47, 48, 48, 13, 12, 11, 10, 11, 12])
[49, 47, 10]
0 голосов
/ 14 июля 2020

Примечание. Избегайте использования list в качестве имени для вашего списка. list - это предопределенное ключевое слово в Python. Вы можете использовать or, чтобы проверить, находитесь ли вы в начале или в конце списка, и в то же время сравнить значения слева и справа. Предполагая, что имя вашего списка l, я думаю, вы хотите это:

mins = [x for i,x in enumerate(l) if ((i==0) or (l[i-1]>=x)) and ((i==len(l)-1) or (x<l[i+1]))]

вывод:

[49, 47, 10]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...