在嵌套字典上使用for循环

时间:2018-10-24 11:20:37

标签: python dictionary nested-loops

我有这样的代码:

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更改为循环的最新迭代。我不知道我在做什么错。有人可以帮我吗?

1 个答案:

答案 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