将嵌套列表转换为嵌套字典

时间:2021-07-18 20:05:39

标签: python dictionary

我正在尝试转换嵌套列表:

#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}}

4 个答案:

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

将其转换为普通 dict