我有这样的代码:
def func_new(my_dict):
sorted_dict = {}
sub_dict={"#source#":'',"#dest#":'',"#join_order#":'',"#variable#":[] ,"#dest_name#":[]}
for key in my_dict:
sub_dict['#source#'] = key
my_dict1=my_dict[key]
for key in my_dict1:
sub_dict['#dest#'] = key
my_dict2=my_dict1[key]
for key in my_dict2:
sub_dict['#join_order#'] = key
my_dict3=my_dict2[key]
var_list = []
dest_list = []
for k,v in my_dict3.items():
var_list.append(k)
dest_list.append(v)
vari_list = var_list
dest_list = dest_list
sub_dict['#variable#'] = vari_list
sub_dict['#dest_name#'] = dest_list
print(sub_dict)
sorted_dict[sub_dict['#join_order#']] = sub_dict['#source#']
#comm-out#sorted_dict[sub_dict['#join_order#']] = sub_dict
return sorted_dict
输入的嵌套字典是这样的:
my_dict = {'source_ appl': {'dest_dynamic': {1 : {u'appl_quoted_rt': u'appl_quoted_rt',
u'approve_amt': u'approve_amt',
u'approve_dt': u'approve_dt',
u'ltv_front_end': u'ltv_front_end',
u'period_end_dt': u'period_end_dt',
u'pti_front_end': u'pti_front_end'}},
'dest_static': {2: {u'account_id': u'account_id',
u'app1_bureau_score_no': u'app1_bureau_score_no',
u'app1_state': u'app1_state',
u'app2_bureau_score_no': u'app2_bureau_score_no',
u'appl_age_of_auto': u'appl_age_of_auto'}}},
'source_installment': {'dest_dynamic': {3: {u'acct_status_cd': u'acct_status_cd',
u'acct_status_desc': u'acct_status_desc',
u'acct_status_to_closed_flg': u'acct_status_to_closed_flg'}},
'dest_static': {4: {u'account_id': u'account_id',
u'acct_open_dt': u'acct_open_dt',
u'application_dt': u'application_dt'
}}}}
sorted_dict的输出如下:
x = func_new(my_dict)
{1: 'source_ appl',
2: 'source_ appl',
3: 'source_installment',
4: 'source_installment'}
我的问题是整个sub_dict都无法得到相同的结果(请参见func_new中的注释行)。的输出就是这个。
{1: {'#dest#': 'dest_static',
'#dest_name#': [u'acct_open_dt', u'account_id', u'application_dt'],
'#join_order#': 4,
'#source#': 'source_installment',
'#variable#': [u'acct_open_dt', u'account_id', u'application_dt']},
2: {'#dest#': 'dest_static',
'#dest_name#': [u'acct_open_dt', u'account_id', u'application_dt'],
'#join_order#': 4,
'#source#': 'source_installment',
'#variable#': [u'acct_open_dt', u'account_id', u'application_dt']},
3: {'#dest#': 'dest_static',
'#dest_name#': [u'acct_open_dt', u'account_id', u'application_dt'],
'#join_order#': 4,
'#source#': 'source_installment',
'#variable#': [u'acct_open_dt', u'account_id', u'application_dt']},
4: {'#dest#': 'dest_static',
'#dest_name#': [u'acct_open_dt', u'account_id', u'application_dt'],
'#join_order#': 4,
'#source#': 'source_installment',
'#variable#': [u'acct_open_dt', u'account_id', u'application_dt']}}
可以看出,它将每个sub_dict更改为循环的最新迭代。我不知道我在做什么错。有人可以帮我吗?
答案 0 :(得分:1)
这是因为,当您执行sorted_dict[sub_dict['#join_order#']] = sub_dict
时,会使sorted_dict[sub_dict['#join_order#']]
指向同一个实例sub_dict
。
字典在python中不是一成不变的。 (有关更多信息,请查看immutable)
您必须创建一个新实例。
为此,请使用copy()
dict
方法
尝试:
def func_new(my_dict):
sorted_dict = {}
sub_dict={"#source#":'',"#dest#":'',"#join_order#":'',"#variable#":[] ,"#dest_name#":[]}
for key in my_dict:
sub_dict['#source#'] = key
my_dict1=my_dict[key]
for key in my_dict1:
sub_dict['#dest#'] = key
my_dict2=my_dict1[key]
for key in my_dict2:
sub_dict['#join_order#'] = key
my_dict3=my_dict2[key]
var_list = []
dest_list = []
for k,v in my_dict3.items():
var_list.append(k)
dest_list.append(v)
vari_list = var_list
dest_list = dest_list
sub_dict['#variable#'] = vari_list
sub_dict['#dest_name#'] = dest_list
sorted_dict[sub_dict['#join_order#']] = sub_dict.copy()
return sorted_dict