将两个具有相同键的字典合并成一个?

4

我看了一些问题,似乎没有一个完全符合我的问题。假设我有两个字典,它们是dict1和dict2。

{'A': 25 , 'B': 41, 'C': 32}

和字典2

{'A':21, 'B': 12, 'C':62}

我正在编写一个程序,需要将它们合并成一个字典finaldict。
{'A': [25 , 21], 'B': [41, 12], 'C': [32, 62]}

非常感谢您的帮助,我已经在这个问题上苦苦挣扎了一段时间,但还是没有进展。


2
您的语法现在无效。您可以将值组合成列表或元组,而不仅仅是将它们列为没有键的值。 - Martijn Pieters
7个回答

14

这是一个通用版本。即使键只存在于其中一个列表中,也可以使用它来创建值为列表的字典。

dic1 = {'A': 25, 'B': 41, 'C': 32}
dic2 = {'A': 21, 'B': 12, 'C': 62}
result = {}
for key in (dic1.keys() | dic2.keys()):
    if key in dic1: result.setdefault(key, []).append(dic1[key])
    if key in dic2: result.setdefault(key, []).append(dic2[key])

print(result)

输出

{'A': [25, 21], 'C': [32, 62], 'B': [41, 12]}

如果你正在使用Python 2,for循环必须更改为:

for key in (dic1.viewkeys() | dic2.keys()):

即使字典中包含重复的内容,这个代码还能正常工作吗?例如,如果dic1 = {'A': 25}和dic2 = {'A':25},那么它会给我result = {'A':[25, 25]} 还是 result = {'A':25}? - Gautam Mainkar
@GautamMainkar 是的,结果将是 {'A':[25, 25]} - thefourtheye

7

如您所知,您的两个字典将始终具有相同的键,您可以使用以下代码:

finaldict = {key:(dict1[key], dict2[key]) for key in dict1}

将它们组合起来,每个值都将是源字典中的值元组。


2
或者使用 for key in dict1.viewkeys() & dict2 只循环所有共享键(Python 3:for key in dict1.keys() & dict2)。 - Martijn Pieters
如果你在运行Python 2.x,可以使用finaldict = dict(((key, [dict1[key], dict2[key]]) for key in dict1)) - IceArdor

3

这是一种方法,使用defaultdict

# the setup
>>> from collections import defaultdict
>>> dict1 = {'A': 25, 'B': 41, 'C': 32}
>>> dict2 = {'A': 21, 'B': 12, 'C': 62}

# the preperation
>>> dicts = [dict1, dict2]
>>> final = defaultdict(list)

# the logic
>>> for k, v in ((k, v) for d in dicts for k, v in d.iteritems()):
    final[k].append(v)

# the result
>>> final 
defaultdict(<type 'list'>, {'A': [25, 21], 'C': [32, 62], 'B': [41, 12]})

1
使用 pydash
from pydash import merge_with
cbk = lambda obj_val, src_val: obj_val + src_val
obj1 = {'a': [1], 'b': [2]}
obj2 = {'a': [3], 'b': [4]}
res = merge_with(obj1, obj2, cbk)
print(res)

结果:

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

你也可以使用dictlib。
import dictlib
obj1 = {'a': [1], 'b': [2]}
obj2 = {'a': [3], 'b': [4],"c":[3]}
c = dictlib.union_setadd(obj1, obj2)
print(c)    
{'a': [1, 3], 'b': [2, 4], 'c': [3]}

1
def combineDict(dict1, dict2):
    res = collections.defaultdict(list)
    for key, value in (dict1.items() | dict2.items()):
        res[key].append(value)
    return res

print(combineDict(dict1, dict2))

0

我只需要合并数量未知的字典,在查看这个问题的答案后,想出了更通用的解决方案:

1) 值字典:

dic1 = {'A': 1, 'B': 1, 'C': 1}
dic2 = {'A': 2, 'B': 2, 'C': 2}
dic3 = {'D': 3, 'E': 3, 'F': 3}

def combineDictVal(*args):
    result = {}
    for dic in args:
        for key in (result.viewkeys() | dic.keys()):
            if key in dic:
                result.setdefault(key, []).append(dic[key])
    return result

print combineDictVal(dic1, dic2, dic3)

结果{'A': [1, 2], 'C': [1, 2], 'B': [1, 2], 'E': [3], 'D': [3], 'F': [3]}

2) 列表的字典(区别在于append/extend*):

dic1 = {'A': [1, 2], 'B': [1, 2], 'C': [1, 2]}
dic2 = {'A': [3, 4], 'B': [3, 4], 'C': [3, 4]}
dic3 = {'D': [5, 6], 'E': [5, 6], 'F': [5, 6]}

def combineDictList(*args):
    result = {}
    for dic in args:
        for key in (result.viewkeys() | dic.keys()):
            if key in dic:
                result.setdefault(key, []).extend(dic[key])
    return result

print combineDictList(dic1, dic2, dic3)

结果: {'A': [1, 2, 3, 4], 'C': [1, 2, 3, 4], 'B': [1, 2, 3, 4], 'E': [5, 6], 'D': [5, 6], 'F': [5, 6]}

3) 适用于整数/列表的通用方法:

dic1 = {'A': 1, 'B': 1, 'C': [1, 1]}
dic2 = {'A': 2, 'B': [2, 2], 'C': 2}
dic3 = {'D': 3, 'E': 3, 'F': [3, 3]}

def combineDict(*args):
    result = {}
    for dic in args:
        for key in (result.viewkeys() | dic.keys()):
            if key in dic:
                if type(dic[key]) is list:
                    result.setdefault(key, []).extend(dic[key])
                else:
                    result.setdefault(key, []).append(dic[key])
    return result

print combineDict(dic1, dic2, dic3)

结果:

{'A': [1, 2], 'C': [1, 1, 2], 'B': [1, 2, 2], 'E': [3], 'D': [3], 'F': [3, 3]}

这些解决方案可能不是最快的,但是它们很明确且完美地工作。希望它能帮助到别人。


0

这是另一种方法,无论键是否仅存在于一个字典中或两个字典中都可以使用。

def merge_dicts(dict_a, dict_b):
    merged_dict = {key: [value] for key, value in dict_a.iteritems()}
    for key, value in dict_a.iteritems():
        try:
            merged_dict[key].append(value)
        except KeyError:
            meeged_dict[key] = [value]
    return ret_dict

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