2016-01-07 9 views
5

ich eine Liste haben, sagen wir mal:Python finden die Indizes einer Liste gegeben eine Bedingung

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

Ich möchte die minimalen und maximalen Indizes dieser Liste finden, wo list_A> 0

im obigen Beispiel also wäre es 3 und 7.

Für weitere Listen sein, die monoton erhöhen, ich habe np.searchsorted benutzen, wie np.searchsorted(list,[0.5,1.0]) zu finden die Indizes, wobei die Liste between 0.5 and 1.0 ist.

Aber dieser Fall ist ganz anders und die np.searchsorted funktioniert hier nicht, oder vielleicht tut es in einer Weise, die ich nicht kenne!

+0

Dieser dupliziert http://stackoverflow.com/questions/7270321/finding-the-index-of-elements-based-on -a-bedingung-using-python-list-compredi (weiß nicht, wie man es so markiert) – tglaria

Antwort

4

Filter die RV-Liste mit indixes und nehmen Sie die min und 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) 

Wenn Sie nur den Index benötigen, entpacken Sie den Wert zurückgegeben:

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

Ihre Lösung ist wirklich einfach. Aber was ich brauche, ist nur der Index, nicht der Wert (d. H. 1,0). 'filtered_list [0]' funktioniert nicht? – ThePredator

+0

@Lafexlos, ist auch eine gute Option. – Netwave

2

Eine Alternative sein würde verwenden 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)) 

Output

3 
7 

next() Mit dem ersten Eintrag in der Liste finden > 0 ist eine elegante Lösung.

Um die letzte Element in der Liste > 0 zu finden ist mit dieser Methode schwieriger. Ich benutze next() zu iterieren und finden Sie die erste Artikel > 0 in der umgekehrten Liste mit list_A[::-1]. Dann wandle ich den erzeugten Index in den korrekten Index um, indem ich ihn von len(list)-1 unter Verwendung von len(list)-1-idx subtrahiere.

+0

Könntest du ein bisschen weiter erklären, was der zweite Schritt macht? – ThePredator

+0

Hilft die Bearbeitung? – gtlambert

+0

Ja! Aber ich finde die Lösung von Daniel benutzerfreundlicher zu lesen. Also habe ich das als Antwort akzeptiert – ThePredator

0

können Sie verwenden, um die np.where Funktion zurückzukehren Indizes aller 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 
Verwandte Themen