2016-01-07 5 views
5

У меня есть список, скажем:Python найти индексы списка данного условие

list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0] 

Я хотел бы найти минимальные и максимальные показатели этого списка, где list_A> 0.

т.е. в приведенном выше примере, это будет 3 и 7.

для других списков, которые возрастают монотонно, я использую np.searchsorted, как np.searchsorted(list,[0.5,1.0]) найти индексы, в которых список равен between 0.5 and 1.0 соответственно.

Но этот случай совсем другой, и np.searchsorted здесь не работает, или, может быть, он делает это так, как я этого не знаю!

+0

Это дублируется http://stackoverflow.com/questions/7270321/finding-the-index-of-elements-based-on -a-condition-using-python-list-comprehensi (не знаю, как его пометить) – tglaria

ответ

4

Фильтр архивный список с его indixes и взять минимальное и максимальное:

>>> list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0] 
>>> filtered_lst = [(x,y) for x,y in enumerate(list_A) if y > 0] 
>>> max(filtered_lst) 
(7, 1.0) 
>>> min(filtered_lst) 
(3, 1.0) 

Если вам просто нужно индекс, распаковывать возвращаемое значение:

>>> maX,_ = max(filtered_lst) 
>>> maX 
7 
+0

Ваше решение действительно просто. Но мне нужен только индекс, а не значение (т. Е. 1.0). 'filter_list [0]' не работает? – ThePredator

+0

@ Lafexlos, тоже хороший вариант. – Netwave

2

Альтернативой было бы использовать next():

list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0] 

print(next(idx for idx, item in enumerate(list_A) if item>0)) 
print(next(len(list_A)-1-idx for idx, item in enumerate(list_A[::-1]) if item>0)) 

Выход

3 
7 

Использование next() найти первый элемент в списке > 0 элегантное решение.

Чтобы найти последний элемент в списке > 0 сложнее с этим методом. Я использую next(), чтобы перебрать и найти item > 0 в обратном списке, используя list_A[::-1]. Затем я конвертирую индекс, сгенерированный в правильный индекс, вычитая его из len(list)-1, используя len(list)-1-idx.

+0

Вы могли бы немного подробнее рассказать о том, что делает второй шаг? – ThePredator

+0

Помогает ли редактировать? – gtlambert

+0

Да! Но я нашел решение Даниэля более удобным для чтения. Поэтому я принял это как ответ – ThePredator

0

Вы можете использовать функцию np.where вернуть индексы всех elements > 0

In [116]: list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0] 

In [117]: arr = np.array(list_A) 

In [118]: indx = np.where(arr > 0)[0] 

In [119]: mini = indx[0] 

In [120]: mini 
Out[120]: 3 

In [121]: maxi = indx[-1] 

In [122]: maxi 
Out[122]: 7