循环遍历字典列表,创建新的字典列表

时间:2016-03-03 01:51:44

标签: python

需要一些关于我的代码的帮助,基本上我有一个包含字典的列表:

例如

my_list = [
{'trans' : 50,'portfolio' : ABC},
{'trans' : 30,'portfolio' : XYZ},
{'trans' : 20, 'portfolio : ABC},
{'trans' : -40, 'portfolio : XYZ}
]

我想遍历这个dicts列表,创建一个新的dict列表,其中键是'portfolio',value是一个基于条件更新的dict。例如,新列表如下所示:

new_list = [
{ABC : [BUY : 70, SELL : 0]},
{XYZ : [BUY : 30 , SELL : -40]}
]

***注意ABC值 - >买[买]是我的'tran'和gt的总和如果没有卖出设置为0,则XYZ - >买入是30是总和本身,而卖出现在已经填充

这是我到目前为止所得到的,我知道这是错的,但却没有失去如何重写它

from collections import defaultdict

buy = 0
sell = 0
 new_dict = defaultdict(lamba: {'BUY' :0,'SELL' : 0})
     for row in my_list:
         if row['tran'] > 0:
           buy += row['tran']
           update = {'BUY': buy}
         else:
           sell += row['tran']
           update = {'SELL' : sell}
         new_dict[row['portfolio']] = update        

正如你所看到的,无论“投资组合”如何,我都会继续增加买入/卖出,但我希望它们只能在我的新债券中基于if / else逻辑增加给予“投资组合”(关键字)。 TRAN”。我上面逻辑的结果如下,这是不正确的

new_list = [
    {ABC : {BUY : 100, SELL : 0}},
    {XYZ : {BUY : 100, SELL : -40}}
    ] 

1 个答案:

答案 0 :(得分:2)

你对python数据结构非常困惑,你不能在列表中有密钥,你不需要只有一个密钥的字典列表。因此,假设您真正想要的是一个字典,其中键是作品集,而值是buysell之和的字典作为单独的值:

>>> results = {}
>>> for t in my_list:
...     trans = 'BUY' if t['trans'] > 0 else 'SELL'
...     a = results.setdefault(t['portfolio'], {'BUY':0, 'SELL':0})
...     a[trans] += t['trans']
>>> results
{'ABC': {'BUY': 0, 'SELL': 0}, 'XYZ': {'BUY': 0, 'SELL': 0}}