根据键匹配合并字典的最快方法

时间:2019-05-02 19:29:36

标签: python python-3.x

我有两个字典:

dic_1={'1234567890': 1, '1234567891': 2, '1234567880': 3, '1234567881': 4}
dic_2={'1234567890': 5, '1234567891': 6}

现在,我想基于键值对其进行合并,以使合并后的字典如下所示:

merged_dic=={'1234567890': 1, '1234567891': 2, '1234567880': 3, '1234567881': 4}

我们只想保留唯一键,并且只保留一个与它们关联的不同值。最好的方法是什么

4 个答案:

答案 0 :(得分:1)

这应该是您所需要的。仅当键不在合并字典中时,才迭代所有添加键/值的字典。

from itertools import chain

merged_dic = {}

for k, v in chain(dic_1.items(), dic_2.items()):
    if k not in merged_dic:
        merged_dic[k] = v

print(merged_dic)
# {'1234567890': 1, '1234567891': 2, '1234567880': 3, '1234567881': 4}

例如,如果您要保留可以使用的键的所有值:

from collections import defaultdict
from itertools import chain

merged_dic = defaultdict(list)

for k, v in chain(dic_1.items(), dic_2.items()):
    merged_dic[k].append(v)

print(merged_dic)
# {'1234567890': [1, 5], '1234567891': [2, 6], '1234567880': [3], '1234567881': [4]}

使用chain()可以使您迭代许多词典。在问题中,您显示了2个字典,但是如果您有4个字典,则可以轻松地将它们全部合并。例如

for k, v in chain(dic_1.items(), dic_2.items(), dic_3.items(), dic_4.items()):

答案 1 :(得分:0)

样本数据不能完全解释SO。如果dic_2与dic_1具有公用密钥,则将该项目保留在dic_1中;否则,将其保留在dic_1中。如果在dic_2中找到了新项目,则将其放入合并字典中。

import copy
dic_1={'1234567890': 1, '1234567891': 2, '1234567880': 3, '1234567881': 4}
dic_2={'1234567890': 5, '8234567890': 6}

merged_d = copy.copy(dic_1)
diff = set(dic_2)-set(dic_1)
merged_d.update({k: dic_2[k] for k in diff})
print(merged_d)

结果:

{'1234567890': 1, '1234567891': 2, '1234567880': 3, '1234567881': 4, '8234567890': 6}

答案 2 :(得分:0)

您真正想做的就是用dic_2中的任何值更新dic_1,以便您可以做

merged_dic = {**dic_2,**dic_1}

这将合并两个字典,从dic_2获取所有值,用dic_1中存在的任何新值更新新字典中的任何键,然后在{{1 }}

答案 3 :(得分:0)

如果您希望第一个字典覆盖第二个字典中的键,则:

dic_2.update(dic_1)