根据另外两个字典替换字典值列表

时间:2019-01-31 23:16:17

标签: python python-3.x list dictionary

我想使用另外两个字典的值替换字典中的值列表。 例如,我有一本名为“ a_dict”的字典,其每个键的值都作为列表

a_dict = {'A1':[10,20,30,40,50,60,70],'B1':[30,50,60,70,80]}

现在,我需要使用new_dict替换a_dict中与“ old_dict”匹配的值,如下所示,

old_dict = {0: 10, 1: 30}

new_dict = {0: 100, 1: 300}

这样新的a_dict应该是

a_dict_new = {'A1':[100,20,300,40,50,60,70],'B1':[300,50,60,70,80]}

我试图提供以下代码,但是它没有给我正确的解决方案,

a_dict = {'A1':[10,20,30,40,50,60,70],'B1':[30,50,60,70,80]}
old_dict = {0: 10, 1: 30}
new_dict = {0: 100, 1: 300}
#a_dict_new = {'A1':[100,20,300,40,50,60,70],'B1':[300,50,60,70,80]}
a_dict_new = {}
for ky1, val1 in old_dict.items():
    for ky2, ls in a_dict.items():
        new_ls=[]
        for v in ls:
            if (v==val1):
                new_ls.append(new_dict[ky1])
            else:
                new_ls.append(v)
        a_dict_new[ky2]=new_ls
#
print(a_dict_new)

OUTPUT 1: {'A1': [10, 20, 300, 40, 50, 60, 70], 'B1': [300, 50, 60, 70, 80]}

在第一个for循环的第一次迭代中,在a_dict_new中将值10更改为100,但是在第二次迭代中,它将覆盖第一个替换。因此,输出看起来只更改了30到300。

有人能建议一种有效的方法来执行此字典替换操作python 3吗?

1 个答案:

答案 0 :(得分:1)

您的逻辑似乎过于复杂。您可以只创建一个映射字典:

mapper = {old_dict[k]: new_dict[k] for k in old_dict.keys() & new_dict.keys()}
# {10: 100, 30: 300}

然后使用它通过字典理解来重新映射值:

a_dict_new = {k: [mapper.get(val, val) for val in v] for k, v in a_dict.items()}
# {'A1': [100, 20, 300, 40, 50, 60, 70], 'B1': [300, 50, 60, 70, 80]}