【问题标题】:Creating heavily nested python dictionaries in a clean programmatic way以干净的编程方式创建高度嵌套的 python 字典
【发布时间】:2016-05-16 05:04:21
【问题描述】:

我正在使用一系列函数来填充高度嵌套的字典。我想知道是否有比下面示例中所示的长赋值字符串更简洁的方法来执行此操作。

outputdict = {}
outputdict['x']={}
outputdict['x']['y']={}
outputdict['x']['y']['total_patients']=len(example_dict.keys())
outputdict['x']['y']['z']={}
for variable1 in variable1s:
    outputdict['x']['y']['z'][str(variable1)]={}
    outputdict['x']['y']['z'][str(variable1)]['total_patients']=function_1(example_dict, variable1).count()
    for popn in ['total','male','female']:
        outputdict['x']['y']['z'][str(variable1)][popn]={}
        for age_bucket in np.linspace(40,60,5):
            age_str = str(age_bucket)+'_'+str(age_bucket+5)
            outputdict['x']['y']['z'][str(variable1)][popn][age_str]={}
            outputdict['x']['y']['z'][str(variable1)][popn]["total"]={}
            for res in restypes:
                if popn == 'total':
                    codelist, ncodes = function_2(function_1(example_dict, variable1), res, age_bucket)
                else:
                    codelist, ncodes = function_2_gender(function_1(example_dict, variable1), res, age_bucket, popn)
                outputdict['x']['y']['z'][str(variable1)][popn][age_str][res]={}
                outputdict['x']['y']['z'][str(variable1)][popn][age_str][res]['total_codes']=ncodes
                outputdict['x']['y']['z'][str(variable1)][popn][age_str][res]['top_codes']=[]
                for item in codelist:
                    disp = {"code": item[0][:2], "value":item[0][2], "count":item[1]}

                    outputdict['x']['y']['z'][str(variable1)][popn][age_str][res]['top_codes'].append(disp)


                codelist, ncodes = list_top_codes(function_1(example_dict, variable1), res)
                outputdict['x']['y']['z'][str(variable1)][popn]["total"][res]={}
                outputdict['x']['y']['z'][str(variable1)][popn]["total"][res]['top_codes']=[]
                for item in codelist:
                    disp = {"code": item[0][:2], "value":item[0][2], "count":item[1]}
                    outputdict['x']['y']['z'][str(variable1)][popn]["total"][res]['top_codes'].append(disp)
outputdict

【问题讨论】:

标签: python dictionary nested


【解决方案1】:

您可以通过使用字典的默认字典来避免字典初始化。 您可以将这些链接到尽可能多的位置,以创建嵌套的字典层次结构。例如,这是一个 2 级和 3 级层次结构字典。

two_level = defaultdict(lambda: defaultdict(dict))
three_level = defaultdict(lambda: defaultdict(lambda: defaultdict(dict)))

您的字典现在如下:two_level[1][2]three_level[1][2][3] 将是空字典 {}

所以在您的情况下,您似乎有 4 级嵌套,所以我可能会将 outputdict 初始化为:

output_dict = defaultdict(lambda: defaultdict(lambda: defaultdict(lambda: defaultdict(dict))))

想不出你可以在这里做什么 - 如果可能的话,我建议你简化这个嵌套结构。

【讨论】:

    【解决方案2】:

    您可以将autovivificationdefaultdict 一起使用。这将允许您跳过空字典的创建,因为它们会在取消引用未定义的键时自动创建:

    from collections import defaultdict
    
    dd = lambda: defaultdict(dd)
    
    d = dd()
    d['foo']['bar']['foobar'] = 1
    

    所以您的代码如下所示:

    outputdict = dd()
    outputdict['x']['y']['total_patients']=len(example_dict.keys())
    
    for variable1 in variable1s:
        outputdict['x']['y']['z'][str(variable1)]['total_patients']=function_1(example_dict, variable1).count()
    

    另一个可能的改进是将嵌套字典存储到变量中,这样您就不必在任何地方输入完整路径:

    for variable1 in variable1s:
        nested = dd()
        outputdict['x']['y']['z'][str(variable1)]=nested
        nested['total_patients']=function_1(example_dict, variable1).count()
    

    【讨论】:

      猜你喜欢
      • 2023-01-18
      • 1970-01-01
      • 2015-08-19
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      相关资源
      最近更新 更多