Search code examples
groupingpython

Grouping Python tuple list


I have a list of (label, count) tuples like this:

[('grape', 100), ('grape', 3), ('apple', 15), ('apple', 10), ('apple', 4), ('banana', 3)]

From that I want to sum all values with the same label (same labels always adjacent) and return a list in the same label order:

[('grape', 103), ('apple', 29), ('banana', 3)]

I know I could solve it with something like:

def group(l):
    result = []
    if l:
        this_label = l[0][0]
        this_count = 0
        for label, count in l:
            if label != this_label:
                result.append((this_label, this_count))
                this_label = label
                this_count = 0
            this_count += count
        result.append((this_label, this_count))
    return result

But is there a more Pythonic / elegant / efficient way to do this?


Solution

  • itertools.groupby can do what you want:

    import itertools
    import operator
    
    L = [('grape', 100), ('grape', 3), ('apple', 15), ('apple', 10),
         ('apple', 4), ('banana', 3)]
    
    def accumulate(l):
        it = itertools.groupby(l, operator.itemgetter(0))
        for key, subiter in it:
           yield key, sum(item[1] for item in subiter) 
    
    print(list(accumulate(L)))
    # [('grape', 103), ('apple', 29), ('banana', 3)]