我有一个这样的字典列表。
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 --+