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

Posted

技术标签:

【中文标题】使用带有 lambda 参数的 reduce 函数获取具有相同键的新字典【英文标题】:Get a new dictionary with the same keys using reduce function with a lambda argument 【发布时间】:2021-12-27 10:42:55 【问题描述】:

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

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

【问题讨论】:

我想这是可能的,但可能有点笨拙。你有没有尝试过……? 为什么要写成一行?您可以通过用; 分隔任意数量的语句将它们放入同一行,但您不应该这样做,因为它会损害代码的可读性。您也可以在单个语句中执行此操作,但这也会损害可读性。 相关:merge-and-sum-of-two-dictionaries 【参考方案1】:

实用方法:

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)

【讨论】:

【参考方案2】:

字典理解可以像这样合并两个字典:

>>> 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

这确实要求所有 dicts 具有相同的键,否则会丢弃一些。更完整的版本是这样的,但它作为 reduce-lambda 确实变得相当笨拙:

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

【讨论】:

您可以使用a.get(k, 0) + b.get(k, 0) for k in a.keys() | b.keys() 来保留密钥。 是的,我只是添加了它,但我不会向任何人推荐它。【参考方案3】:

以下方法使用 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 --+

【讨论】:

以上是关于使用带有 lambda 参数的 reduce 函数获取具有相同键的新字典的主要内容,如果未能解决你的问题,请参考以下文章

Python lambda map filter reduce

lambda&filter&map&reduce函数的基本使用

1lambda是什么?及filter,map,reduce

python之lambda,filter,map,reduce函数

python六剑客:map()lambda()filter()reduce()推导类表切片

Python常用内置函数整理(lambda,reduce,zip,filter,map)