我正在尝试根据键值合并两个字典。但是,我无法实现它。以下是我尝试解决的方法。
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'}
我的结果字典应该是
output = {'D': [741, 114, 306, 70],
'B': [77, 325, 505, 144],
'C': [937, 339, 612, 100],
'A': [52, 811, 1593, 350]}
我的代码
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)
但是我将其作为输出
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]]}
使用简单的字典理解:
output = {dict2[k]: v for k,v in dict1.items()}
输出:
{'D': [741, 114, 306, 70],
'B': [77, 325, 505, 144],
'C': [937, 339, 612, 100],
'A': [52, 811, 1593, 350]}
虽然 @mozway 的简单字典理解无疑是最直接、最优雅的解决方案,但它基于以下假设:
dict1
的键是 dict2
的键的子集。如果没有,您将得到 KeyError
。
如果该假设不成立,您需要自己决定当
dict1
中的键不存在于dict2
中时如何处理这种情况。我想到了几个选择:
None
。例如,这是一个使用选项 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
测试:
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))
输出:
{'D': [741, 114], 'B': [77, 325], 'C': [937, 339], 'A': [52, 811]}
作为奖励,由于存在类型变量,静态类型检查器将根据参数类型正确推断其返回的字典的特定类型。 IE。使用示例中的
dict1
和 dict2
,合并字典的类型将被推断为 dict[str, list[int]]
。
顺便说一句,如果你选择选项 1,你仍然可以将其写成一个不错的小字典理解,只需添加条件:
output = {dict2[key]: value for key, value in dict1.items() if key in dict2}
结果是一样的。
您可以使用
dict.update()
:
def mergeDictionary(dict_obj1, dict_obj2):
dict_obj3 = dict()
for key, val in dict_obj1.items():
dict_obj3.update({dict_obj2[key]: val})
return dict_obj3
或:
def mergeDictionary(dict_obj1, dict_obj2):
dict_obj3 = dict()
for key, val in dict_obj1.items():
dict_obj3[dict_obj2[key]] = val
return dict_obj3
错误似乎在这一行:
dict_obj3[key] = [value , dict_obj1[key]]
您想使用
value
作为标准将元素分配给字典,如下所示:
dict_obj3[value] = dict_obj1[key]
这段代码应该可以解决问题:
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'}
# My resultant dictionary should be
# output={D: [741, 114, 306, 70], B: [77, 325, 505, 144], C: [937, 339, 612, 100], A: [52, 811, 1593, 350]}
# My code
def mergeDictionary(dict_obj1, dict_obj2):
dict_obj3 = {} # {**dict_obj1, **dict_obj2}
for key, value in dict_obj2.items():
dict_obj3[value] = dict_obj1[key]
return dict_obj3
dict_3 = mergeDictionary(dict1, dict2)
print(dict_3)
使用列表理解将新键映射到结果字典中
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'}
dict3={dict2[key]: dict1[key] for key in dict2}
print(dict3)
输出
{'A': [52, 811, 1593, 350], 'B': [77, 325, 505, 144], 'C': [937, 339, 612, 100], 'D': [741, 114, 306, 70]}