Python 为重复键保留值的合并词典
给定n个字典,编写一个函数,返回一个唯一的字典,其中包含重复键的值列表 例如: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 = [] ...
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}
。