Find monotonic sequences in a list?

后端 未结 4 403
一整个雨季
一整个雨季 2020-12-11 23:52

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

4条回答
  •  南方客
    南方客 (楼主)
    2020-12-12 00:08

    @uselpa's version is fine. Here's mine (same issue with [50] instead of just 50) that uses collections.deque to be a little more efficient, and also some long comments...

    #! /usr/bin/env python
    
    from collections import deque
    
    def process(lst):
        """
        Given a list of values that is not sorted (such that for some
        valid indices i,j, i lst[j]), produce a
        new list-of-lists, such that in the new list, each sublist *is*
        sorted:
            for all sublist \elem returnval:
                assert_is_sorted(sublist)
        and furthermore this is the minimal set of sublists required
        to achieve the condition.
    
        Thus, if the input list lst is actually sorted, this returns
        [list(lst)].
        """
        def sublist(deq):
            """
            Pop items off the front of deque deq until the next one
            goes backwards.  Return the constructed sub-list.
            """
            sub = [deq.popleft()]
            while deq and deq[0] >= sub[-1]:
                sub.append(deq.popleft())
            return sub
    
        # Make a copy of lst before modifying it; use a deque so that
        # we can pull entries off it cheaply.
        deq = deque(lst)
        output = []
        ret = []
        while deq:
            ret.append(sublist(deq))
        return ret
    
    print process([45,78,120,47,58,50,32,34])
    

    (Incidentally, in the days before collections.deque I'd probably just use a reversed copy of lst and use lst.pop() in sublist. That's not quite as obvious, though.)

提交回复
热议问题