我希望从多个字典中创建一个新的字典。
- 所有字典中的键都必须在结果字典中存在
- 每个键只能出现一次
- 每个键对应的值是所有字典中该键对应值的最大值
例如:
d1 = {'a':1, 'b':3}
d2 = {'a':5, 'd':5}
d3 = {'c':2, 'f':1}
d = {'a':5, 'b':3, 'c':2, 'd':5, 'f':1}
此外,我希望键(字符串类型)按照我的示例进行排序。我尝试使用
update
方法,但它只会用最新的值覆盖现有的值,而不是最高的值。我希望从多个字典中创建一个新的字典。
例如:
d1 = {'a':1, 'b':3}
d2 = {'a':5, 'd':5}
d3 = {'c':2, 'f':1}
d = {'a':5, 'b':3, 'c':2, 'd':5, 'f':1}
update
方法,但它只会用最新的值覆盖现有的值,而不是最高的值。>>> from collections import Counter
>>> d1 = {'a':1, 'b':3}
>>> d2 = {'a':5, 'd':5}
>>> d3 = {'c':2, 'f':1}
>>> Counter(d1) | Counter(d2) | Counter(d3)
Counter({'a': 5, 'd': 5, 'b': 3, 'c': 2, 'f': 1})
这里使用了多重集合的并集,通过collections.Counter
实现。
如果需要排序结果:
>>> from collections import Counter, OrderedDict
>>> OrderedDict(sorted((Counter(d1) | Counter(d2) | Counter(d3)).items()))
OrderedDict([('a', 5), ('b', 3), ('c', 2), ('d', 5), ('f', 1)])
使用reduce
可以将此推广到N个字典
>>> from functools import reduce
>>> from operator import or_
>>> reduce(or_, map(Counter, (d1, d2, d3)))
Counter({'a': 5, 'd': 5, 'b': 3, 'c': 2, 'f': 1})
Counter
,并删除了其他的答案。 - jamylak