如何在第一个值相同的列表中对元组求和?

时间:2013-08-12 19:04:08

标签: python

我有一个股票和头寸列表作为元组。买入为正,卖出为负。例如:

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

如何计算股票的头寸,以获得当前持股?

result = [('AAPL', 0), ('RY', 57)]

4 个答案:

答案 0 :(得分:14)

这个怎么样?您可以阅读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)]

答案 1 :(得分:1)

以下是不涉及导入的解决方案:

>>> 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)]
>>>

请注意,这是针对Python 2.x.在3.x中,您需要执行:Result = list(map(tuple, d.items()))

答案 2 :(得分:1)

我会使用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})

然后,您可以调用most_common对象的Counter方法来获取按值按降序排序的元组列表。

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

如果您需要按照第一个元素对元组进行排序,请使用sorted(c.items())

In [6]: sorted(c.items())
Out[6]: [('AAPL', 0), ('RY', 57)]

答案 3 :(得分:0)

没有任何明确的循环:

>>> 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)]