【问题标题】:Replace list object dictionary values with values of another dictionary, if value/key pairs of two dictionaries match如果两个字典的值/键对匹配,则将列表对象字典值替换为另一个字典的值
【发布时间】:2017-08-05 23:46:02
【问题描述】:

我有两个这样的字典:

dict1 = {'parent1': ['AAA','BBB'],'parent2': ['AAA','CCC'],'parent3': ['ZZZ', 'BBB']}
dict2 = {'AAA': 'alfa','BBB': 'beta','CCC': 'gamma', 'ZZZ':'epsilon'}

我想得到以下字典

dict3 = {'parent1': ['alfa','beta'],'parent2': ['alfa','gamma'],'parent3': ['epsilon', 'beta']}

其中 dict1 的值存储在列表中,如果与 dict2 键匹配,则替换为 dict2 值。

我试过了

dict3={k: dict2.get(v, v) for k, v in dict1.items()}

但它会返回

TypeError: unhashable type: 'list'

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    您缺少对 v 值(列表)的迭代。

    dict1 = {'parent1': ['AAA','BBB'],'parent2': ['AAA','CCC'],'parent3': ['ZZZ', 'BBB']}
    dict2 = {'AAA': 'alfa','BBB': 'beta','CCC': 'gamma', 'ZZZ':'epsilon'}
    
    dict3={k: [dict2.get(i, i) for i in v] for k, v in dict1.items()}
    

    结果:

    {'parent3': ['epsilon', 'beta'], 'parent2': ['alfa', 'gamma'], 'parent1': ['alfa', 'beta']}
    

    【讨论】:

      【解决方案2】:

      Pythonic 较少,但也能胜任。完全一样,只是写出来了。

       dict3={k: [dict2[v[0]], dict2[v[1]]] for k, v in dict1.items()}
       prints {'parent3': ['epsilon', 'beta'], 'parent2': ['alfa', 'gamma'], 'parent1': ['alfa', 'beta']}
      

      已编辑:

       dict3={k: [dict2.get(v[0],v[0]), dict2.get(v[1],v[1])] for k, v in dict1.items()}
       prints {'parent3': ['epsilon', 'beta'], 'parent2': ['alfa', 'gamma'], 'parent1': ['alfa', 'beta']}
      

      【讨论】:

      • 不处理值不在dict2中的情况
      • 是的,尽管我说 dict2 始终具有 dict1 的值,但我读错了问题
      • 现在我们的答案完全一样 ;) 只是取决于您是否喜欢额外的 for 循环以及 dict1 是否始终包含具有两个值的列表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2022-08-17
      • 2021-03-11
      相关资源
      最近更新 更多