How do I sum tuples in a list where the first value is the same?
Solution 1:
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)]
Solution 2:
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()))
.
Solution 3:
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)]