我正在使用一系列函数来填充重度嵌套的字典。我想知道是否有更简洁的方法来执行此操作,而不仅仅是长分配字符串,如下例所示。
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
答案 0 :(得分:0)
您可以将autovivification与defaultdict
一起使用。这将允许您跳过空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))))
无法想到您可以在此处执行的任何操作 - 如果可能,我建议您简化此嵌套结构。