需要一些关于我的代码的帮助,基本上我有一个包含字典的列表:
例如
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}}
]
答案 0 :(得分:2)
你对python数据结构非常困惑,你不能在列表中有密钥,你不需要只有一个密钥的字典列表。因此,假设您真正想要的是一个字典,其中键是作品集,而值是buy
和sell
之和的字典作为单独的值:
>>> 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}}