我有一个作为元组的股票和头寸列表。买入为正,卖出为负。例子:
p = [('AAPL', 50), ('AAPL', -50), ('RY', 100), ('RY', -43)]
我怎样才能总结股票的头寸,以获得当前的持股量?
result = [('AAPL', 0), ('RY', 57)]
我有一个作为元组的股票和头寸列表。买入为正,卖出为负。例子:
p = [('AAPL', 50), ('AAPL', -50), ('RY', 100), ('RY', -43)]
我怎样才能总结股票的头寸,以获得当前的持股量?
result = [('AAPL', 0), ('RY', 57)]
这个怎么样?您可以阅读有关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)]
这是一个不涉及导入的解决方案:
>>> 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()))
.
我会这样做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)]
没有任何显式循环:
>>> 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)]