Python: Find monotonic sequences in a list
Question: I'm new in Python but basically I want to create sub-groups of element from
the list with a double loop, therefore I gonna compare the first element with
the next to figure out if I can create these sublist, otherwise I will break
the loop inside and i want continue with the last element but in the main
loop:

Example: `5,7,8,4,11`

Compare 5 with 7, is minor? yes so include in the newlist and with the inside
for continue with the next 8, is minor than 5? yes, so include in newlist, but
when compare with 4, I break the loop so I want continue in m with these 4 to
start with the next, in this case with 11...

    
    
    for m in xrange(len(path)):
        for i in xrange(m+1,len(path)):
                  if (path[i] > path[m]):
                      newlist.append(path[i])
    
                 else:
                      break
    
                 m=m+i
    

Thanks for suggestions or other ideas to achieve it!

PD. Some input will be: input:[45,78,120,47,58,50,32,34] output:
[45,78,120],[47,58],50,[32,34]

the idea why i want make a double loops due to to compare sub groups of the
full list,in other way is while 45 is minor than the next one just add in the
new list, if not take the next to compare in this case will be 47 and start to
compare with 58


Answer: No loop! Well at least, no _explicit_ looping...

    
    
    import itertools
    
    def process(lst):
        # Guard clause against empty lists
        if len(lst) < 1:
            return lst
    
        # use a dictionary here to work around closure limitations
        state = { 'prev': lst[0], 'n': 0 }
    
        def grouper(x):
            if x < state['prev']:
                state['n'] += 1
    
            state['prev'] = x
            return state['n']
    
        return [ list(g) for k, g in itertools.groupby(lst, grouper) ]
    

Usage (work both with Python 2 & Python 3):

    
    
    >>> data = [45,78,120,47,58,50,32,34]
    >>> print (list(process(data)))
    [[45, 78, 120], [47, 58], [50], [32, 34]]
    

Joke apart, if you need to _group_ items in a list
[`itertools.groupby`](http://docs.python.org/2/library/itertools.html#itertools.groupby)
deserves a little bit of attention. Not always the easiest/best answer -- but
worth to make a try...

* * *

**EDIT:** If you don't like _closures_ \-- and prefer using an _object_ to
hold the state, here is an alternative:

    
    
    class process:
        def __call__(self, lst):
            if len(lst) < 1:
                return lst
    
            self.prev = lst[0]
            self.n = 0
    
            return [ list(g) for k, g in itertools.groupby(lst, self._grouper) ]
    
        def _grouper(self, x):
            if x < self.prev:
                self.n += 1
    
            self.prev = x
            return self.n
    
    
    
    data = [45,78,120,47,58,50,32,34]
    print (list(process()(data)))
    

* * *

**EDIT2:** Since I prefer closures ... but @torek don't like the _dictionary_
syntax, here a third variation around the same solution:

    
    
    import itertools
    
    def process(lst):
        # Guard clause against empty lists
        if len(lst) < 1:
            return lst
    
        # use an object here to work around closure limitations
        state = type('State', (object,), dict(prev=lst[0], n=0))
    
        def grouper(x):
            if x < state.prev:
                state.n += 1
    
            state.prev = x
            return state.n
    
        return [ list(g) for k, g in itertools.groupby(lst, grouper) ]
    
    data = [45,78,120,47,58,50,32,34]
    print (list(process(data)))
    

