如何合并两个具有相同键名的字典?

33

我是Python的新手,正在尝试编写一个函数,用于合并两个Python字典对象。例如:

dict1 = {'a':[1], 'b':[2]}
dict2 = {'b':[3], 'c':[4]}

我需要生成一个新的合并字典

dict3 = {'a':[1], 'b':[2,3], 'c':[4]}

函数还应该带有一个名为“conflict”的参数(设置为True或False)。当conflict设为False时,上述内容是正确的。当conflict设为True时,代码将像这样合并字典:

dict3 = {'a':[1], 'b_1':[2], 'b_2':[3], 'c':[4]}
我正在尝试追加这两个字典,但不确定正确的方法是什么。
for key in dict1.keys():
    if dict2.has_key(key):
        dict2[key].append(dict1[key])

太好了,感谢extend以正确的方式进行操作,但我仍然无法添加两个字典。使用我拥有的代码,我只能添加到dict2的键中。@ John Kugelman - nasia jaffri
5
哦,https://dev59.com/w3VC5IYBdhLWcg3wjx_u 不是完全重复的问题。 - kennytm
感谢@Kenny TM。我有比那篇帖子更多的问题。我知道extend和append之间的区别,但我想要合并这两个字典。如果Conflict设置为False,则需要以不同的方式合并键。请指导如何做到这一点。 - nasia jaffri
你最终使用了被接受的答案做什么? - Noctis Skytower
显示剩余2条评论
2个回答

11
如果您想要合并副本,而不改变原始字典并监视名称冲突,您可以尝试这个解决方案:

如果您想要一个不改变原始字典且检测到名称冲突的合并副本,您可以尝试以下解决方案:

#! /usr/bin/env python3
import copy
import itertools


def main():
    dict_a = dict(a=[1], b=[2])
    dict_b = dict(b=[3], c=[4])
    complete_merge = merge_dicts(dict_a, dict_b, True)
    print(complete_merge)
    resolved_merge = merge_dicts(dict_a, dict_b, False)
    print(resolved_merge)


def merge_dicts(a, b, complete):
    new_dict = copy.deepcopy(a)
    if complete:
        for key, value in b.items():
            new_dict.setdefault(key, []).extend(value)
    else:
        for key, value in b.items():
            if key in new_dict:
                # rename first key
                counter = itertools.count(1)
                while True:
                    new_key = f'{key}_{next(counter)}'
                    if new_key not in new_dict:
                        new_dict[new_key] = new_dict.pop(key)
                        break
                # create second key
                while True:
                    new_key = f'{key}_{next(counter)}'
                    if new_key not in new_dict:
                        new_dict[new_key] = value
                        break
            else:
                new_dict[key] = value
    return new_dict


if __name__ == '__main__':
    main()

程序会显示合并后的两个字典的以下表示:

{'a': [1], 'b': [2, 3], 'c': [4]}
{'a': [1], 'b_1': [2], 'b_2': [3], 'c': [4]}

3
我认为您需要这个:
dict1 = {'a':[1], 'b':[2]}
dict2 = {'b':[3], 'c':[4]}

def mergeArray(conflict):
    for key in dict1.keys():
        if dict2.has_key(key):
            if conflict==False:
                dict2[key].extend(dict1[key])
            else:
                dict2[key+'_1'] = dict1[key]
                dict2[key+'_2'] = dict2.pop(key)
        else:
            dict2[key] = dict1[key]

mergeArray(True);
print dict2

1
太棒了,非常感谢。这正是我在寻找的,而且之前(在Python - append vs. extend)没有回答过。 - nasia jaffri
1
这应该是被接受的答案,因为它简单而且功能强大。它还适用于OP(@nasiajaffri)。 - perennial_noob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接