How do I remove consecutive duplicates from a list?
Question: How do I remove consecutive duplicates from a list like this in python?

    
    
    lst = [1,2,2,4,4,4,4,1,3,3,3,5,5,5,5,5]
    

Having a unique list or set wouldn't solve the problem as there are some
repeated values like 1,...,1 in the previous list.

I want the result to be like this:

    
    
    newlst = [1,2,4,1,3,5]
    

Would you also please consider the case when I have a list like this `[4, 4,
4, 4, 2, 2, 3, 3, 3, 3, 3, 3]` and I want the result to be `[4,2,3,3]` rather
than `[4,2,3]` .


Answer: [itertools.groupby()](https://docs.python.org/3/library/itertools.html#itertools.groupby)
is your solution.

    
    
    newlst = [k for k, g in itertools.groupby(lst)]
    

* * *

If you wish to group and limit the group size by the item's value, meaning 8
4's will be [4,4], and 9 3's will be [3,3,3] here are 2 options that does it:

    
    
    import itertools
    
    def special_groupby(iterable):
        last_element = 0
        count = 0
        state = False
        def key_func(x):
            nonlocal last_element
            nonlocal count
            nonlocal state
            if last_element != x or x >= count:
                last_element = x
                count = 1
                state = not state
            else:
                count += 1
            return state
        return [next(g) for k, g in itertools.groupby(iterable, key=key_func)]
    
    special_groupby(lst)
    

OR

    
    
    def grouper(iterable, n, fillvalue=None):
        "Collect data into fixed-length chunks or blocks"
        # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
        args = [iter(iterable)] * n
        return itertools.zip_longest(*args, fillvalue=fillvalue)
    
    newlst = list(itertools.chain.from_iterable(next(zip(*grouper(g, k))) for k, g in itertools.groupby(lst)))
    

Choose whichever you deem appropriate. Both methods are for numbers > 0.

