I have a list, let's say:
list_A = [0,0,0,1.0,2.0,3.0,2.0,1.0,0,0,0]
I would like to find the minimum and maximum indices of this list where list_A > 0
, i.e. in the above example, it would be 3 and 7.
For other lists, which increase monotonically, I have been using np.searchsorted
, like np.searchsorted(list,[0.5,1.0])
to find the indices wherein the list is between 0.5 and 1.0
respectively.
But this case is quite different and the np.searchsorted
doesn't work here, or maybe it does in a way which I don't know !
Filter the zipped list with its indixes and take the min and the 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)
If you just need the index, unpack the returned value:
>>> maX,_ = max(filtered_lst)
>>> maX
7
An alternative would be to use 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
Using next()
to find the first item in the list > 0
is an elegant solution.
To find the last item in the list > 0
is trickier with this method. I use next()
to iterate over and find the first item > 0
in the reversed list using list_A[::-1]
. I then convert the index generated to the correct index by subtracting it from len(list)-1
, using len(list)-1-idx
.
You can use the np.where
function to return indices of all 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With