Python合并N个字典,每个键保留最高值

3

我希望从多个字典中创建一个新的字典。

  • 所有字典中的键都必须在结果字典中存在
  • 每个键只能出现一次
  • 每个键对应的值是所有字典中该键对应值的最大值

例如:

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 方法,但它只会用最新的值覆盖现有的值,而不是最高的值。
1个回答

5
>>> 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})

那是一行非常密集的代码。 - Blender
@Blender 现在我改用Counter,并删除了其他的答案。 - jamylak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接