如何在没有违约的情况下退回已售出和购买的股票数量?

时间:2018-04-22 20:56:50

标签: python dictionary

对于这个问题,我们得到这个字典,其键是名称;其中包含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

谢谢!

2 个答案:

答案 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