2016-01-07 16 views
5

Mam listę, powiedzmy:Python znaleźć indeksy listy dany warunek

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

chciałbym znaleźć minimalnych i maksymalnych wskaźników tej liście gdzie list_A> 0.

czyli w powyższym przykładzie, to byłoby 3 i 7.

przypadku innych list, które zwiększają monotonicznie, Używam np.searchsorted, jak np.searchsorted(list,[0.5,1.0]) znaleźć indeksy, których lista wynosi odpowiednio: between 0.5 and 1.0.

Ale ta sprawa jest zupełnie inna i np.searchsorted tu nie działa, a może działa w sposób, którego nie znam!

+0

ten jest powielany http://stackoverflow.com/questions/7270321/finding-the-index-of-elements-based-on -a-condition-using-python-list-comprehensi (nie wiem jak to oznaczyć) – tglaria

Odpowiedz

4

Przesączyć spakowany lista z jego indixes i podjąć min i max:

>>> 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) 

Jeśli wystarczy indeks rozpakować Wartość zwracana:

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

Twoje rozwiązanie jest naprawdę proste. Ale potrzebuję tylko wskaźnika, a nie wartości (tj. 1,0). 'filters_list [0]' nie działa? – ThePredator

+0

@ Lafexlos, jest również dobrym rozwiązaniem. – Netwave

2

Alternatywą byłoby używać 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)) 

wyjściowa

3 
7 

Korzystanie next() znaleźć pierwszy element na liście > 0 jest eleganckim rozwiązaniem.

Aby znaleźć pozycję ostatnia pozycja na liście > 0, ta metoda jest trudniejsza. Używam next() do iteracji i znajdowania najpierw pozycji > 0 na odwróconej liście przy użyciu list_A[::-1]. Następnie przekonwertuję wygenerowany indeks na poprawny indeks, odejmując go od len(list)-1, używając len(list)-1-idx.

+0

Czy mógłbyś wyjaśnić nieco dalej, co robi drugi krok? – ThePredator

+0

Czy edycja pomaga? – gtlambert

+0

Tak! Ale uważam, że rozwiązanie Daniela jest bardziej przyjazne dla użytkownika. Tak więc zaakceptowałem to jako odpowiedź – ThePredator

0

Można użyć funkcji np.where powrót indeksów wszystkich 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