【问题标题】:Merge dictionaries to overwrite duplicate keys without overwriting duplicate and non-duplicate values合并字典以覆盖重复键而不覆盖重复和非重复值
【发布时间】:2023-01-19 18:10:54
【问题描述】:

输入:

dict1 = {a: [xxx, zzz]}
dict2 = {a: [yyy, zzz]}

期望的输出:

dict3 = {a: [xxx, zzz, yyy, zzz]}

我努力了:

dict3 = dict1 | dict2

dict3 = dict1.copy()
d3 |= d2

但是,合并 | 和更新 |= 运算符会优先使用最后一次看到的字典进行覆盖,从而导致:

dict3 = {a: [yyy, zzz]}

【问题讨论】:

    标签: python-3.x dictionary merge key-value overwrite


    【解决方案1】:

    这是期望的结果,如 PEP 584 中所述,

    Dict union 将返回一个由左操作数组成的新字典 与右操作数合并,每个操作数必须是一个字典(或一个 dict 子类的实例)。如果一个键出现在两个操作数中,则 最后看到的值(即来自右侧操作数的值)获胜

    您可能需要手动合并两个字典:

    In [8]: dict1 = {'a': ['xxx', 'zzz']}
       ...: dict2 = {'a': ['yyy', 'zzz']}
       ...: for k, v in dict2.items():
       ...:     if k in dict1:
       ...:         dict1[k] += v
       ...:
    
    In [9]: print(dict1)
    {'a': ['xxx', 'zzz', 'yyy', 'zzz']}
    

    【讨论】:

    • 不幸的是,这并没有按照 OP 的要求执行,原因有二:#1 它更新了 dict1 而不是创建一个新的字典 dict3 和 #2 它忽略了 dict2 中存在但不存在于 dict1 中的项目,因此它不是完全合并两个命令。尽管它适用于给定的示例,但两个字典都具有相同的键。
    【解决方案2】:

    xiez 的回答没有执行 OP 的要求,原因有二:

    1. 它更新 dict1 而不是创建新的独立 dict3
    2. 它错过了所有只存在于 dict2 中的项目,因为它只对 dict1 中存在的项目做出反应(第 4 行)——尽管这在给定的示例中并不明显

      一个可能的解决方案:

      dict3 = {
        k: dict1.get(k, []) + dict2.get(k, [])
        for k in set(dict1) | set(dict2)
      }
      

      对于两个源字典的联合键集中的每个键,我们使用字典的 get 函数来提取键的值(如果存在),或者获取默认的空列表。然后我们通过盲目地为每个键添加找到的或默认的列表来创建新的 dict3。

      BR 迈克尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2021-07-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      相关资源
      最近更新 更多