如何将嵌套的defaultdict()默认为指定长度的列表?

时间:2018-03-17 00:41:24

标签: python dictionary defaultdict

我想知道如何将嵌套的defaultdict默认为列表[0,0,0]。例如,我想制作这种分层默认用语。

dic01 = {'year2017': {'jul_to_sep_temperature':[25, 20, 17], 
                      'oct_to_dec_temperature':[10,  8,  7]},
         'year2018': {'jan_to_mar_temperature':[ 8,  9, 10].
                      'apr_to_jun_temperature':[ 0,  0,  0]}
        }

为了制作这个嵌套的词典,我做了dic01 = defaultdict(dict)并添加了一个词典dic01['year2018']['jan_temperature'] = [8, 9, 10]。我的问题是,是否可以在不事先绑定[0,0,0]的情况下更新列表的每个元素。在其他工作中,如果我将defaultdict设为defaultdict(dict),我必须在使用之前绑定列表[0,0,0],并且我想跳过此绑定过程。

# The way I do this
dic01['year2018']['jul_to_sep_temperature'] = [0,0,0]    # -> how to omit this procedure?
dic01['year2018']['jul_to_sep_temperature'][0] = 25

# The way I want to do this
dic01['year2018']['jul_to_sep_temperature'][0] = 25      # by the end of July

2 个答案:

答案 0 :(得分:7)

您可以指定您希望默认值为defaultdict的默认值为[0, 0, 0]

from collections import defaultdict

dic01 = defaultdict(lambda: defaultdict(lambda: [0, 0, 0]))

dic01['year2018']['jul_to_sep_temperature'][0] = 25

print(dic01)

打印

defaultdict(<function <lambda> at 0x7f4dc28ac598>, {'year2018': defaultdict(<function <lambda>.<locals>.<lambda> at 0x7f4dc28ac510>, {'jul_to_sep_temperature': [25, 0, 0]})})

您可以将其视为常规嵌套字典

答案 1 :(得分:2)

不确定这是否比您要避免的更优雅,但是:

dic01 = defaultdict(lambda: defaultdict(lambda: [0,0,0]))
dic01['year2018']['jul_to_sep_temperature'][0] = 25

你可以通过传递lambda函数

来嵌套defaultdicts