Python 为重复键保留值的合并词典

Python 为重复键保留值的合并词典,python,merge,duplicates,Python,Merge,Duplicates,给定n个字典,编写一个函数,返回一个唯一的字典,其中包含重复键的值列表 例如: d1 = {'a': 1, 'b': 2} d2 = {'c': 3, 'b': 4} d3 = {'a': 5, 'd': 6} 结果: >>> newdict {'c': 3, 'd': 6, 'a': [1, 5], 'b': [2, 4]} 到目前为止,我的代码是: >>> def merge_dicts(*dicts): ... x = [] ...

给定n个字典,编写一个函数,返回一个唯一的字典,其中包含重复键的值列表

例如:

d1 = {'a': 1, 'b': 2}
d2 = {'c': 3, 'b': 4}
d3 = {'a': 5, 'd': 6}
结果:

>>> newdict
{'c': 3, 'd': 6, 'a': [1, 5], 'b': [2, 4]}
到目前为止,我的代码是:

>>> def merge_dicts(*dicts):
...     x = []
...     for item in dicts:
...         x.append(item)
...     return x
...
>>> merge_dicts(d1, d2, d3)
[{'a': 1, 'b': 2}, {'c': 3, 'b': 4}, {'a': 5, 'd': 6}]
生成一个新字典并为这些重复键生成一个值列表的最佳方法是什么

def merge_dicts(*dicts):
    d = {}
    for dict in dicts:
        for key in dict:
            try:
                d[key].append(dict[key])
            except KeyError:
                d[key] = [dict[key]]
    return d
本报告如下:

{'a': [1, 5], 'b': [2, 4], 'c': [3], 'd': [6]}
这个问题有点不同。这里所有字典值都是列表。如果长度为1的列表不需要这样做,则添加:

    for key in d:
        if len(d[key]) == 1:
            d[key] = d[key][0]

返回d
语句之前。然而,我真的无法想象你什么时候想要删除这个列表。(考虑将列表作为值的情况;然后删除项目周围的列表会导致不明确的情况。)

Python提供了一个简单而快速的解决方案:在
集合
模块中。根据文档中的示例:

使用
列表
作为
默认工厂
,可以很容易地对 将键值对放入列表字典:

>>>s=[('yellow',1),('blue',2),('yellow',3),('blue',4),('red',1)]
>>>d=defaultdict(列表)
>>>对于s中的k,v:
... d[k]。附加(v)

>>>d.项目() [('blue',[2,4]),('red',),('yellow',[1,3])]

当第一次遇到每个键时,它不在 制图;因此,使用
default\u factory
函数,返回空列表。这个
list.append()
操作然后将值附加到新列表。什么时候 如果再次遇到密钥,则正常进行查找(返回 该键的列表)和
list.append()
操作添加了另一个键 将值添加到列表中

在你的情况下,大概是:

import collections

def merge_dicts(*dicts):
    res = collections.defaultdict(list)
    for d in dicts:
        for k, v in d.iteritems():
            res[k].append(v)
    return res

>>> merge_dicts(d1, d2, d3)
defaultdict(<type 'list'>, {'a': [1, 5], 'c': [3], 'b': [2, 4], 'd': [6]})
导入集合
def合并指令(*指令):
res=collections.defaultdict(列表)
对于dicts中的d:
对于k,v在d.iteritems()中:
res[k].追加(v)
返回res
>>>合并指令(d1、d2、d3)
defaultdict(,{'a':[1,5],'c':[3],'b':[2,4],'d':[6]})

d1=['a':1,'b':2]
字典的语法错误,应该是
d1={'a':1,'b':2}