代码之家  ›  专栏  ›  技术社区  ›  Paul Thomas

基于另外两个词典替换词典值列表

  •  2
  • Paul Thomas  · 技术社区  · 5 年前

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

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

    现在我需要用一个新的dict替换与“old”匹配的dict中的值,如下所示,

    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 = {'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循环的第一次迭代中,值10在一个新的dict中更改为100,但在第二次迭代中,它覆盖了第一次替换。因此,输出看起来只更改了30到300。

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

    1 回复  |  直到 5 年前
        1
  •  1
  •   jpp    5 年前

    你的逻辑似乎太复杂了。您只需创建一个映射字典:

    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]}