减少函数不处理空列表

Posted

技术标签:

【中文标题】减少函数不处理空列表【英文标题】:Reduce function doesn't handle an empty list 【发布时间】:2016-02-29 23:26:46 【问题描述】:

我之前创建了一个递归函数来查找列表的乘积。 现在我创建了相同的函数,但使用了reduce 函数和lamdba

当我运行这段代码时,我得到了正确的答案。

items = [1, 2, 3, 4, 10]
print(reduce(lambda x, y: x*y, items))

但是,当我给出一个空列表时,会发生错误 - reduce() of empty sequence with no initial value。这是为什么呢?

当我创建递归函数时,我创建了处理空列表的代码,reduce 函数的问题只是它不是为了处理和清空列表而设计的吗?还是有其他原因?

我似乎无法在网上找到任何问题或任何解释原因的内容,我只能找到针对特定人员问题的解决方案的问题,没有任何解释。

【问题讨论】:

【参考方案1】:

正如documentation中所写:

如果存在可选初始化器,则在计算中将其放置在可迭代项之前,并在可迭代项为空时用作默认值。如果没有给出初始化程序并且可迭代只包含一个项目,则返回第一个项目。

因此,如果您希望代码使用空列表,则应使用初始化程序:

>>> reduce(lambda x, y: x*y, [], 1)
1

【讨论】:

啊,好吧,我很困惑,因为我找到了一个使用参数(函数、可迭代、初始化程序)的 reduce 代码示例。我认为该列表以某种方式被用作初始化程序,但感谢您的澄清! @Chris iterable[0] 用作 initializer is None 时的初始化程序,但在您的情况下 [][0] 不存在因此错误。【参考方案2】:

reduce() 需要一个初始值才能开始其操作。如果序列中没有值并且没有明确的值开始,那么它不能开始操作并且不会有一个有效的返回值。指定一个显式的初始值,以允许它使用空序列进行操作:

print (reduce(lambda x, y: x*y, items, 1))

【讨论】:

以上是关于减少函数不处理空列表的主要内容,如果未能解决你的问题,请参考以下文章

在 Haskell 中即时减少列表

python3使用迭代生成器yield减少内存占用

MySql 函数

处理空值,把 Null 值转换为实际值(coalesce,nvl 函数用法)

Pandas Groupby Agg 函数不减少

应用三参数函数“减少”列表的pythonic方法是啥?