Grouping Python tuple list

前端 未结 7 1603
日久生厌
日久生厌 2020-11-30 07:47

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

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


        
相关标签:
7条回答
  • 2020-11-30 08:01

    using itertools and list comprehensions

    import itertools
    
    [(key, sum(num for _, num in value))
        for key, value in itertools.groupby(l, lambda x: x[0])]
    

    Edit: as gnibbler pointed out: if l isn't already sorted replace it with sorted(l).

    0 讨论(0)
  • 2020-11-30 08:05
    import collections
    d=collections.defaultdict(int)
    a=[]
    alist=[('grape', 100), ('banana', 3), ('apple', 10), ('apple', 4), ('grape', 3), ('apple', 15)]
    for fruit,number in alist:
        if not fruit in a: a.append(fruit)
        d[fruit]+=number
    for f in a:
        print (f,d[f])
    

    output

    $ ./python.py
    ('grape', 103)
    ('banana', 3)
    ('apple', 29)
    
    0 讨论(0)
  • 2020-11-30 08:06

    Method

    def group_by(my_list):
        result = {}
        for k, v in my_list:
            result[k] = v if k not in result else result[k] + v
        return result 
    

    Usage

    my_list = [
        ('grape', 100), ('grape', 3), ('apple', 15),
        ('apple', 10), ('apple', 4), ('banana', 3)
    ]
    
    group_by(my_list) 
    
    # Output: {'grape': 103, 'apple': 29, 'banana': 3}
    

    You Convert to List of tuples like list(group_by(my_list).items()).

    0 讨论(0)
  • 2020-11-30 08:07
    >>> from itertools import groupby
    >>> from operator import itemgetter
    >>> L=[('grape', 100), ('grape', 3), ('apple', 15), ('apple', 10), ('apple', 4), ('banana', 3)]
    >>> [(x,sum(map(itemgetter(1),y))) for x,y in groupby(L, itemgetter(0))]
    [('grape', 103), ('apple', 29), ('banana', 3)]
    
    0 讨论(0)
  • 2020-11-30 08:12

    Or a simpler more readable answer ( without itertools ):

    pairs = [('foo',1),('bar',2),('foo',2),('bar',3)]
    
    def sum_pairs(pairs):
      sums = {}
      for pair in pairs:
        sums.setdefault(pair[0], 0)
        sums[pair[0]] += pair[1]
      return sums.items()
    
    print sum_pairs(pairs)
    
    0 讨论(0)
  • 2020-11-30 08:22

    my version without itertools
    [(k, sum([y for (x,y) in l if x == k])) for k in dict(l).keys()]

    0 讨论(0)
提交回复
热议问题