[EMAIL PROTECTED] wrote: > If this is the list. > > values = [ 0, 72, 0, 4, 9, 2, 0, 0, 42, 26, 0, 282, > 23, 0, 101, 0, 0, 0, 0, 0] > > as we can see there are peaks in the list.that is 0,72,0 is a > group(triangle) with peak 72.then 0, 4, 9, 2, 0, 0 with peak > 9 and 0, 42, 26, 0 with 42 and so on... > what I want is the left and right bound index of each bin(triangle).The > list could as big as possible.So some heurestic algorithm which could > first find max in the list and look for local maxima and minima and > group its adjcent bounds.Then find next max and group the bins and so > on. > > so that we can get > > [[0,2],[2,7],[7,10],[10,13]] > ( indexes of the bounds in the values list). so first group [0,2] > correspond to 0,72,0 in the values list and so on... > Hope I am clear.
Not exactly your output, but hopefully you can tailor it to your needs: py> values = [0, 72, 0, 4, 9, 2, 0, 0, 42, 26, 0, 282, 23, 0, 101, 0, 0, 0, 0, 0] py> def isnonzero((index, val)): ... return val != 0 ... py> import itertools py> for nonzero, vals in itertools.groupby(enumerate(values), isnonzero): ... if nonzero: ... vals = list(vals) ... start = vals[0][0] - 1 ... end = vals[-1][0] + 1 ... print [start, end], "values: ", values[start:end+1] ... [0, 2] values: [0, 72, 0] [2, 6] values: [0, 4, 9, 2, 0] [7, 10] values: [0, 42, 26, 0] [10, 13] values: [0, 282, 23, 0] [13, 15] values: [0, 101, 0] Note that the real work is done by itertools.groupby. Zero terms are grouped together and ignored; non-zero terms are gathered together in lists. STeVe -- http://mail.python.org/mailman/listinfo/python-list