2015-04-13 4 views
0

Учитывая большой список флуктуирующих значений, как вы определяете все локальные значения min? Не используется numpy. Локальный минимум означает все значения в списке, которые являются желобами функции.Большой список, найти все минимумы списка (python)

List_y = [23, 8, -7, 57, 87, 6] 

Я хотел бы:

New_list = [-7, 6] 
+0

Если число меньше двух с обеих сторон. –

+0

Возможный дубликат [Поиск локальных максимумов/минимумов с помощью Numpy в массиве 1D numpy] (http://stackoverflow.com/questions/4624970/finding-local-maxima-minima-with-numpy-in-a-1d-numpy -array) – TheBlackCat

+0

Здесь нет никакого упоминания. Не предполагайте, что у людей автоматически есть внешние библиотеки. – Zizouz212

ответ

2
def local_min(ys): 
    return [y for i, y in enumerate(ys) 
      if ((i == 0) or (ys[i - 1] >= y)) 
      and ((i == len(ys) - 1) or (y < ys[i+1]))] 


>>> local_min([23, 8, -7, 57, 87, 6]) 
[-7, 6] 
>>> local_min([23, 6, 6, 6, 42]) 
[6] 
>>> local_min([6, 6, 4]) 
[4] 
+0

При задании '[6, 6, 4]' вы будете печатать '[6, 4]'. –

+0

@BillLynch: Nice catch –

+0

@BillLynch: Я изменил его другим способом, вы можете помочь мне обнаружить другие недостатки? –

2

Я большой поклонник итерация этих проблем поэтапно.

l = [23, 8, -7, -7, 57, 87, 6] 

# Remove identical neighbors 
# l becomes [23, 8, -7, 57, 87, 6] 
l = [x for x,y in zip(l[0:], l[1:]) if x != y] + [l[-1]] 

# Append positive infinity to both endpoints 
# l becomes [inf, 23, 8, -7, 57, 87, 6, inf] 
l = [float("inf")] + l + [float("inf")] 

# Retain elements where each of their neighbors are greater than them. 
# l becomes [-7, 6] 
l = [y for x, y, z in zip(l[0:], l[1:], l[2:]) if x > y < z] 
+0

Я думаю, что это недооценено :) – JuniorCompressor

+0

На самом деле отличный код! Спасибо вам! –

+0

Как я понимаю из его определения, минимумы не являются строго меньшими, чем его соседи, но могут быть равны (из них). Таким образом, я думаю, что ваш _Remove одинаковый соседи_ шаг может быть устранен, а код будет: '>>> l = [23, 8, -7, -7, 57, 87, 6]' >>> l = [float ("inf")] + l + [float ("inf")] '>>> l = [y для x, y, z в zip (l [0:], l [1:], l [2:]), если x> = y <= z] ' >>> l ' [-7, -7, 6] ' – boardrider

Смежные вопросы