合并字典,保留重复键的值
问题描述
给定 n 个字典,编写一个函数,该函数将返回一个唯一字典,其中包含重复键的值列表.
Given n dictionaries, write a function that will return a unique dictionary with a list of values for duplicate keys.
例子:
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}]
生成一个为这些重复键生成一个值列表的新字典的最佳方法是什么?
What would be the best way to produce a new dictionary that yields a list of values for those duplicate keys?
解决方案
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 的列表不希望这样做,则添加:
There is a slight difference to the question. Here all dictionary values are lists. If that is not to be desired for lists of length 1, then add:
for key in d:
if len(d[key]) == 1:
d[key] = d[key][0]
在 return d
语句之前.但是,我真的无法想象您何时想要删除该列表.(考虑将列表作为值的情况;然后删除项目周围的列表会导致模棱两可的情况.)
before the return d
statement. However, I cannot really imagine when you would want to remove the list. (Consider the situation where you have lists as values; then removing the list around the items leads to ambiguous situations.)
相关文章