以干净的编程方式创建重度嵌套的python词典

时间:2016-05-16 05:04:22

标签: python dictionary nested

我正在使用一系列函数来填充重度嵌套的字典。我想知道是否有更简洁的方法来执行此操作,而不仅仅是长分配字符串,如下例所示。

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

您可以使用dict的defaultdict来避免字典初始化。 您可以根据需要链接这些以创建嵌套字典层次结构。例如,这是一个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))))

无法想到您可以在此处执行的任何操作 - 如果可能,我建议您简化此嵌套结构。