使用带lambda参数的reduce函数获取一个具有相同键的新字典



我有一个这样的字典列表。

fruit = [{"apple": 10, "pear": 20, "banana": 30, "strawberry": 50},
{"apple": 12, "pear": 5, "banana": 20, "strawberry": 5},
{"apple": 15, "pear": 26, "banana": 32, "strawberry": 8}]

我可以在一行中写一个reduce函数(带lambda参数(来获得一个具有相同键的新字典吗。新字典的每个键的值是对应键的所有值的总和。预期的输出应该是一个字典,如下所示:

{'apple': 37.0, 'pear': 51.0, 'banana': 82.0, 'strawberry': 63.0}

Util重型进近:

from operator import add
from collections import Counter
from functools import reduce
reduce(add, map(Counter, fruit))
# Counter({'banana': 82, 'strawberry': 63, 'pear': 51, 'apple': 37})

或者对初学者来说可能更有指导意义,为两条格言写一个add

def add(d1, d2):
return {k: d1.get(k, 0) + d2.get(k, 0) for k in d1.keys() | d2.keys()}
reduce(add, fruit)

一个dict理解可以完成合并两个dict的工作,如下所示:

>>> from functools import reduce
>>> fruit = [{"apple": 10, "pear": 20, "banana": 30, "strawberry": 50},
...          {"apple": 12, "pear": 5, "banana": 20, "strawberry": 5},
...          {"apple": 15, "pear": 26, "banana": 32, "strawberry": 8}]
>>> reduce(lambda a, b: {k: a[k] + v for k, v in b.items()}, fruit)
{'apple': 37, 'pear': 51, 'banana': 82, 'strawberry': 63}

这确实要求所有dict都有相同的密钥,否则一些dict将被丢弃。更完整的版本是这样的,尽管作为一个reduce lambda,它确实变得非常笨拙:

reduce(lambda a, b: {k: a.get(k, 0) + b.get(k, 0) for k in a.keys() | b.keys()}, fruit)

以下方法使用dict理解,不使用导入。不过,我不建议使用它:

{k: sum(f.get(k,0) for f in fruit) for k in {k for f in fruit for k in f}}
#                                           |                           |
#                                           +-- set of all fruit keys --+

最新更新