代码之家  ›  专栏  ›  技术社区  ›  maynull

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

  •  3
  • maynull  · 技术社区  · 6 年前

    我想知道如何将嵌套的defaultdict默认为列表 [0,0,0] . 例如,我想将这个层次结构设置为defaultdict。

    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 回复  |  直到 6 年前
        1
  •  7
  •   Patrick Haugh    6 年前

    您可以指定希望的默认值为 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]})})
    

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

        2
  •  2
  •   avigil    6 年前

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

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

    你可以筑巢 defaultdicts 通过传递lambda函数