更新密钥而不影响嵌套字典中密钥的值

时间:2019-03-05 21:27:17

标签: python dictionary

我正在尝试在嵌套字典中保留键值的同时更新键。 虽然我找到了一种方法来做到这一点,但我不得不创建新的字典来迎合它。因此,想知道是否有人可以为我提供关于我所采用方法的更好的见解?

init_dict = {
    'pageA' : {
        0 : {
            'menuA' : [
                'a01',
                'a02'
            ]
        }
    },
    'pageB' : {
        1 : {
            'menuB' : [
                'b10'
            ]
        }
    }
}

changed = {'pageB' : 0, 'pageA' : 1}

condense_dict = {}
for k, v in init_dict.items():
    for i in v.keys():
        condense_dict[k] = init_dict[k][i]


new_dict = {}
for i in condense_dict:
    new_dict[i] = {}
    new_dict[i][changed.get(i)] = condense_dict.get(i)

我的预期输出如下:

{
    'pageA' : {
        1 : {
            'menuA' : [
                'a01',
                'a02'
            ]
        }
    },
    'pageB' : {
        0 : {
            'menuB' : [
                'b10'
            ]
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您可以从子字典中弹出大概唯一的键,并将其分配给changed中每个条目的新键:

for k, v in changed.items():
    init_dict[k][v] = init_dict[k].pop(next(iter(init_dict[k])))

init_dict变为:

{'pageA': {1: {'menuA': ['a01', 'a02']}}, 'pageB': {0: {'menuB': ['b10']}}}

答案 1 :(得分:0)

可以使用.pop()方法来完成此操作(尽管我确信您可以将其重写得更好)

init_dict = {
    'pageA': {
        0: {
            'menuA' : [
                'a01',
                'a02'
            ]
        }
    },
    'pageB': {
        1: {
            'menuB': [
                'b10'
            ]
        }
    }
}
print(init_dict)
thing = init_dict.pop('pageA')
sub_thing = thing.pop(0)
redone = {1: sub_thing}
init_dict.update({'pageA': redone})
print(init_dict)
  

{'pageA':{0:{'menuA':['a01','a02']}},'pageB':{1:{'menuB':['b10']}}}}      

{'pageA':{1:{'menuA':['a01','a02']}},'pageB':{1:{'menuB':['b10']}}}}

您可以看到与开始时相同的数据,但是我们将0更改为1

答案 2 :(得分:-1)

在这里,我使用.pop()并就地更改它。使用与您相同的init_dict

change_to = {1: 0, 0: 1}

for k, v in init_dict.items():
    for old_key in v.keys(): 
        if old_key in change_to:
            v[change_to[old_key]] = v.pop(old_key)