9

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

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

我怎样才能总结股票的头寸,以获得当前的持股量?

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

4 回答 4

15

这个怎么样?您可以阅读有关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)]
于 2013-08-12T19:06:45.390 回答
2

这是一个不涉及导入的解决方案:

>>> 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())).

于 2013-08-12T19:26:44.983 回答
2

我会这样做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)]
于 2016-12-03T13:43:06.250 回答
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)]
于 2013-08-12T19:18:40.047 回答