在python中合并两个字典

问题描述 投票:0回答:6

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

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]]}
python dictionary merge key-value
6个回答
13
投票

使用简单的字典理解:

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

5
投票

虽然 @mozway 的简单字典理解无疑是最直接、最优雅的解决方案,但它基于以下假设:

dict1
的键是
dict2
的键的子集。如果没有,您将得到
KeyError

如果该假设成立,您需要自己决定当

dict1
中的键不存在于
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

测试:

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}

结果是一样的。


4
投票

您可以使用

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

2
投票

错误似乎在这一行:

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)

0
投票

如果您已经在项目中使用 pandas,它有一个方法可以完全满足您的要求:

import pandas as pd

df1 = pd.DataFrame(dict1)
df1.rename(columns=dict2)
df1

否则可能不值得。


0
投票

使用列表理解将新键映射到结果字典中

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]}
© www.soinside.com 2019 - 2024. All rights reserved.