在python中合并两个字典

Arj*_*jun 15 python merge dictionary key-value

我正在尝试根据键值合并两个字典。但是,我无法实现它。以下是我尝试解决的方法。

dict1 = {4: [741, 114, 306, 70],
         2: [77, 325, 505, 144],
         3: [937, 339, 612, 100],
         1: [52, 811, 1593, 350]}
dict2 = {1: 'A', 2: 'B', 3: 'C', 4: 'D'}
Run Code Online (Sandbox Code Playgroud)

我的结果字典应该是

output = {'D': [741, 114, 306, 70],
          'B': [77, 325, 505, 144],
          'C': [937, 339, 612, 100],
          'A': [52, 811, 1593, 350]}
Run Code Online (Sandbox Code Playgroud)

我的代码

def mergeDictionary(dict_obj1, dict_obj2):
    dict_obj3 = {**dict_obj1, **dict_obj2}
    for key, value in dict_obj3.items():
        if key in dict_obj1 and key in dict_obj2:
               dict_obj3[key] = [value , dict_obj1[key]]
    return dict_obj3

dict_3 = mergeDictionary(dict1, dict2)
Run Code Online (Sandbox Code Playgroud)

但我将其作为输出

dict_3={4: ['D', [741, 114, 306, 70]], 2: ['B', [77, 325, 505, 144]], 3: ['C', [937, 339, 612, 100]], 1: ['A', [52, 811, 1593, 350]]}
Run Code Online (Sandbox Code Playgroud)

moz*_*way 13

使用简单的字典理解:

output = {dict2[k]: v for k,v in dict1.items()}
Run Code Online (Sandbox Code Playgroud)

输出:

{'D': [741, 114, 306, 70],
 'B': [77, 325, 505, 144],
 'C': [937, 339, 612, 100],
 'A': [52, 811, 1593, 350]}
Run Code Online (Sandbox Code Playgroud)


Dan*_*erg 5

虽然 @mozway 的简单字典理解无疑是最直接、最优雅的解决方案,但它基于dict1这样的假设: 的键是 的键的子集dict2。如果没有,您将得到一个KeyError.

如果该假设不成立,您需要自己决定如何处理 中dict1不存在key 的情况dict2。我想到了几个选项:

  1. 如果第二个字典中缺少该键,只需丢弃该键即可。
  2. 使用一些(可散列的)默认/占位符键,例如None
  3. 提出更具描述性的错误,告诉调用者到底出了什么问题。
  4. 收集在某个单独的数据结构中的第二个字典中未找到键的值。

例如,以下是使用选项 1 的通用函数:

from collections.abc import Hashable, Mapping
from typing import TypeVar

KeyShared = TypeVar("KeyShared", bound=Hashable)
KeyOut = TypeVar("KeyOut", bound=Hashable)
Value = TypeVar("Value")

def merge(
    keys_map: Mapping[KeyShared, KeyOut],
    values_map: Mapping[KeyShared, Value],
) -> dict[KeyOut, Value]:
    output = {}
    for key, value in values_map.items():
        if key in keys_map:
            output[keys_map[key]] = value
    return output
Run Code Online (Sandbox Code Playgroud)

测试:

if __name__ == "__main__":
    dict1 = {
        5: [1, 2, 3],
        4: [741, 114],
        2: [77, 325],
        3: [937, 339],
        1: [52, 811],
    }
    dict2 = {1: 'A', 2: 'B', 3: 'C', 4: 'D'}
    print(merge(dict2, dict1))
Run Code Online (Sandbox Code Playgroud)

输出:

{'D': [741, 114], 'B': [77, 325], 'C': [937, 339], 'A': [52, 811]}
Run Code Online (Sandbox Code Playgroud)

作为奖励,由于存在类型变量,静态类型检查器将根据参数类型正确推断其返回的字典的特定类型。即,使用示例中的dict1dict2,合并字典的类型将被推断为dict[str, list[int]]

顺便说一句,如果您选择选项 1,您仍然可以将其编写为一个不错的小字典理解,只需添加条件即可:

{'D': [741, 114], 'B': [77, 325], 'C': [937, 339], 'A': [52, 811]}
Run Code Online (Sandbox Code Playgroud)

结果是一样的。