对于这个问题,我们得到这个字典,其键是名称;其中包含3个值的元组:在3元组中,股票名称,交易的股票数量(int)和每股的价格(int)。
new_dict = {
'Carl': [('Intel', 30, 40), ('Dell' , 20, 50), ('Intel',-10, 60),
('Apple', 20, 55)],
'Barb': [('Intel', 20, 40), ('Intel',-10, 45), ('IBM', 40, 30),
('Intel',-10, 35)],
'Alan': [('Intel', 20, 10), ('Dell', 10, 50), ('Apple', 80, 80), ('Dell',
-10, 55)],
'Dawn': [('Apple', 40, 80), ('Apple' ,40, 85), ('Apple',-40, 90)]
}
我正在创建一个交易函数,它接受new_dict并返回一个字典,其中键是所有在交易中出现的股票;该值是一个股票是2个列表,其中第一个指数是该股票的购买股票数量,其第二个指数是该股票的销售股票数量。 买入是正股票,卖出是任何负数的股票。
此功能的输出应为:
{'Intel': [70, 30], 'Dell': [30, 10], 'Apple': [180, 40], 'IBM': [40, 0]}
这是我到目前为止所做的:
def traded(database :{str: (str, int, int)}) ->dict:
result_dict = dict()
intel = []
dell = []
apple = []
ibm = []
for key, val in database.items():
pos_sum = 0
for x in val:
if x[1] > 0:
pos_sum += x[1]
return pos_sum
我试图通过为每家股份公司单独列出单独为每家股份公司做这件事,但我觉得这只是单调乏味。我不确定每个股份公司还有哪些其他技术可以做到这一点。
是否有一种简单易懂的方法,最好没有defaultdict
?
谢谢!
答案 0 :(得分:1)
这应该对你有用(虽然肯定有一种更紧凑的方式):
stock_dict = {}
for user_list in new_dict.values():
for stock_tuple in user_list:
stock_name = stock_tuple[0]
if (not (stock_name in stock_dict.keys())):
stock_dict[stock_name] = list(stock_tuple[1:])
else:
stock_dict[stock_name][0] += stock_tuple[1]
stock_dict[stock_name][1] -= stock_tuple[2]
基本上你要做的是为特定键创建一个值(如果它不存在 - 这部分只是必要的,因为你不想使用默认的dict),如果它确实存在,你添加相关的值。
答案 1 :(得分:1)
您可以使用defaultdict
代替dict.setdefault
:
d = {}
for k, v in new_dict.items():
for company, shares, price in v:
if shares > 0:
d.setdefault(company, [0, 0])[0] += shares
else:
d.setdefault(company, [0, 0])[1] -= shares
<强>结果强>
{'Apple': [180, 40], 'Dell': [30, 10], 'IBM': [40, 0], 'Intel': [70, 30]}
<强>解释强>
[0, 0]
。new_dict
并以适当的索引增加份额。defaultdict解决方案
from collections import defaultdict
d = defaultdict(lambda: [0, 0])
for k, v in new_dict.items():
for company, shares, price in v:
if shares > 0:
d[company][0] += shares
else:
d[company][1] -= shares