我正在尝试转换嵌套列表:
#stock[symbol,price,amount,side]
stocks = [["AAPL",10,5,0],["AAPL",15,2,1],["AAPL",25,1,1],["AAPL",30,4,0],
["TSLA",10,5,0],["TSLA",15,2,1],["TSLA",25,1,1],["TSLA",30,4,0]]
进入字典,如:
#res = {"symbol":{price:total_amount,price:total_amount}
res = {"AAPL":{10:5,15:2,25:1,30:4},"TSLA":{10:5,15:2,25:1,30:4}}
subdict
的计算公式为:
subdict ={}
for s,p,a,side in stocks:
subdict[p] = subdict.get(p,0)+a
份额返回 total_share.e.g.如果股票 = [["AAPL",10,3,0],["AAPL",10,3,0]] 应该返回 {"AAPL":{10:6}}
答案 0 :(得分:2)
from collections import defaultdict
res = defaultdict(dict)
for stock in stocks:
res[stock[0]][stock[1]] = stock[2]
我使用 defaultdict
所以我不需要在分配前检查字典键。
输出:
{'AAPL': {10: 5, 15: 2, 25: 1, 30: 4}, 'TSLA': {10: 5, 15: 2, 25: 1, 30: 4}}
答案 1 :(得分:1)
您可以使用 itertools.groupby
将共享相同符号的每个子列表收集到一个单独的迭代器中。
from itertools import groupby
from operator import itemgetter
f = itemgetter(0)
res = {symbol: set(f'{v[1]}:{v[2]}' for v in itr)
for symbol, itr in groupby(sorted(stocks, key=f), f)}
答案 2 :(得分:1)
已更新为您的评论
#Create result dict
res={}
for list in stocks:
key = list[0]
#Verify if the key are in the dict
if key not in res :
res[key]= {}
#Verify if the 'sub-key' are in the nested-dict
if list[1] not in res[key] :
#if dont, initalizes
res[key][list[1]] = list[2]
else:
#Else sum
res[key][list[1]] += list[2]
查看您的数据,我假设您想要一个字典,其中键是每个列表中的第一项,内容是嵌套字典,其中键是列表的第二个值,内容是第三个值(第四个也是最后一个值将被忽略)。
答案 3 :(得分:1)
为此我会考虑使用 defaultdict。它将允许您一次性制作出具有良好可读性的数据结构。
from collections import defaultdict
stocks = [["AAPL",10,5,0],["AAPL",15,2,1],["AAPL",25,1,1],["AAPL",30,4,0],
["TSLA",10,5,0],["TSLA",15,2,1],["TSLA",25,1,1],["TSLA",30,4,0]]
res = defaultdict(dict)
for symbol, k, v, *rest in stocks:
res[symbol][k] = v
结果
defaultdict(dict,
{'AAPL': {10: 5, 15: 2, 25: 1, 30: 4},
'TSLA': {10: 5, 15: 2, 25: 1, 30: 4}})
defaultdict 的操作就像访问元素的 dict 一样。您始终可以通过将其传递给 dict()