在Python中合并列表的两个词典

时间:2015-11-26 05:34:59

标签: python dictionary

有两个词典

x={1:['a','b','c']}
y={1:['d','e','f'],2:['g']}

我想要另一个字典z,它是x和y的合并之一,以便

z = {1:['a','b','c','d','e','f'],2:['g']}

是否可以执行此操作? 我尝试了更新操作

x.update(y)

但它给了我以下结果

z= {1:['d','e','f'],2:['g']}

6 个答案:

答案 0 :(得分:3)

你可以这样做:

final = {}
dicts = [x,y]

for D in dicts:
    for key, value in D:
        final[key] = final.get(key,[]).extend(value)
如果该密钥存在,

final.get(key,[])将获得final的值,否则它将是一个空列表。 .extend(value)会使用D中的相应值(在此情况下为xy)扩展该列表,无论是否为空。

答案 1 :(得分:1)

for k, v in x.items():
if k in y.keys():
    y[k] += v
else:
    y[k] = v

循环遍历字典获取键和值,检查键是否已存在,在这种情况下追加,否则添加带键值的新键。如果您的值是不具有列表的混合数据类型,那么它将无法工作。

   x={1:['a','b','c'], 3:['y']} 
.. y={1:['d','e','f'],2:['g']} 
..  
..  
.. for k, v in x.items(): 
..     if k in y.keys(): 
..         y[k] += v 
..     else: 
..         y[k] = v 
..      
.. print y
{1: ['d', 'e', 'f', 'a', 'b', 'c'], 2: ['g'], 3: ['y']}

答案 2 :(得分:1)

这对我有用:

d1={'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]}
d2 = {'a':[10,11,12], 'b':[13,14,15], 'c':[16,17,18]}
d3 = {}
for k in d1.keys():
    d3.update( {k : []} )
    for i in d1[k]:
        d3[k].append(i)
    for j in d2[k]:
        d3[k].append(j)
print(d3)

我知道这是一种回旋方式,但是当字典值为ndarrays时,其他方法无效。

答案 3 :(得分:0)

在这种情况下可以使用

Counter()

>>> x={1:['a','b','c']}
>>> y={1:['d','e','f'],2:['g']}
>>> from collections import Counter
>>> Counter(x) + Counter(y)
Counter({2: ['g'], 1: ['a', 'b', 'c', 'd', 'e', 'f']})

如果需要的结果是dict。您可以使用以下内容:

z = dict(Counter(x) + Counter(y))

答案 4 :(得分:0)

单行解决方案:

{ key:x.get(key,[])+y.get(key,[]) for key in set(list(x.keys())+list(y.keys())) }

示例1:

x={1:['a','b','c']}
y={1:['d','e','f'],2:['g']}
{ key:x.get(key,[])+y.get(key,[]) for key in set(list(x.keys())+list(y.keys())) }

输出:

  

{1:['a','b','c','d','e','f'],2:['g']}

示例2:

one = {'a': [1, 2], 'c': [5, 6], 'b': [3, 4]}
two = {'a': [2.4, 3.4], 'c': [5.6, 7.6], 'd': [3.5, 4.5]}
{ key:one.get(key,[])+two.get(key,[]) for key in set(list(one.keys())+list(two.keys())) }

输出:

  

{'a':[1,2,2.4,3.4],'b':[3,4],'c':[5,6,5.6,7.6],'d':[3.5,   4.5]}

答案 5 :(得分:0)

以下是适用于任意数量词典的Python 3解决方案:

def dict_merge(*dicts_list):
    result = {}
    for d in dicts_list:
        for k, v in d.items():
            result.setdefault(k, []).append(v)
    return result

请注意,此解决方案可能会创建具有重复值的列表。如果需要唯一值,请使用set()

def dict_merge(*dicts_list):
    result = {}
    for d in dicts_list:
        for k, v in d.items():
            result.setdefault(k, set()).add(v)
    return result