【发布时间】:2012-05-09 03:08:35
【问题描述】:
在 Haskell 中实现以下目标的最惯用方法是什么:
foldl (+) 0 [1,2,3,4,5]
--> 15
或者它在 Ruby 中的等价物:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
显然,Python 提供了 reduce 函数,它是 fold 的一个实现,与上面完全相同,但是,我被告知“pythonic”的编程方式是避免 lambda 术语和高阶函数,在可能的情况下更喜欢列表理解。因此,在 Python 中是否有一种折叠列表或类似列表的结构的首选方法,它不是 reduce 函数,还是 reduce 是实现此目的的惯用方式?
【问题讨论】:
-
sum还不够好? -
不确定这是否是您问题的一个很好的例子。使用
sum可以轻松实现,您可能需要提供一些不同类型的示例。 -
Hey JBernardo - 对数字列表求和是一个相当简陋的例子,我对使用一些二元运算和起始值累积列表元素的一般想法更感兴趣,而不是专门对整数求和。
-
@mistertim:
sum()实际上提供了有限的功能。例如sum([[a], [b, c, d], [e, f]], [])返回[a, b, c, d, e, f]。 -
虽然使用列表执行此操作的情况很好地证明了使用此技术需要注意的事项 -
+在列表上是时间和内存中的线性时间操作,使整个调用二次.使用list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])总体上是线性的 - 如果您只需要迭代一次,您可以放弃对list的调用以使其在内存方面保持不变。
标签: python list functional-programming reduce fold