How do I sum tuples in a list where the first value is the same?

前端 未结 4 1355
孤街浪徒
孤街浪徒 2020-11-30 12:58

I have a list of stocks and positions as tuples. Positive for buy, negative for sell. Example:

p = [(\'AAPL\', 50), (\'AAPL\', -50), (\'RY\', 100), (\'RY\',          


        
相关标签:
4条回答
  • 2020-11-30 13:14

    without any explicit loops:

    >>> from itertools import groupby
    >>> from operator import itemgetter
    >>> p = [('AAPL', 50), ('AAPL', -50), ('RY', 100), ('RY', -43)]
    >>> map(lambda g: (g[0], sum(map(itemgetter(1), g[1]))),
    ...     groupby(sorted(p), itemgetter(0)))
    [('AAPL', 0), ('RY', 57)]
    
    0 讨论(0)
  • 2020-11-30 13:18

    How about this? You can read about collections.defaultdict.

    >>> from collections import defaultdict
    >>> testDict = defaultdict(int)
    >>> p = [('AAPL', 50), ('AAPL', -50), ('RY', 100), ('RY', -43)]
    >>> for key, val in p:
            testDict[key] += val
    
    
    >>> testDict.items()
    [('AAPL', 0), ('RY', 57)]
    
    0 讨论(0)
  • 2020-11-30 13:18

    Here is a solution that doesn't involve importing:

    >>> p = [('AAPL', 50), ('AAPL', -50), ('RY', 100), ('RY', -43)]
    >>> d = {x:0 for x,_ in p}
    >>> for name,num in p: d[name] += num
    ...
    >>> Result = map(tuple, d.items())
    >>> Result
    [('AAPL', 0), ('RY', 57)]
    >>>
    

    Note this is for Python 2.x. In 3.x, you'll need to do: Result = list(map(tuple, d.items())).

    0 讨论(0)
  • 2020-11-30 13:34

    I would do this using collections.Counter:

    In [2]: from collections import Counter
    
    In [3]: c = Counter()
    
    In [4]: for k, v in p:
       ...:     c[k] += v
       ...:     
    In [5]: c
    Out[5]: Counter({'AAPL': 0, 'RY': 57})
    

    Then you can call the most_common method of Counter objects to get a list of tuples sorted by the values in descending order.

    In [5]: c.most_common()
    Out[5]: [('RY', 57), ('AAPL', 0)]
    

    In case you need to sort tuples by their first elements, use sorted(c.items()):

    In [6]: sorted(c.items())
    Out[6]: [('AAPL', 0), ('RY', 57)]
    
    0 讨论(0)
提交回复
热议问题