在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完全相同的功能,但实际上是如上所述的fold的实现,但是,有人告诉我,“ pythonic”编程方式是避免使用lambda
术语和高阶函数,并尽可能使用列表理解。因此,有没有一种首选的方式来折叠列表或不是Python reduce
函数的类似列表的结构,或者是reduce
惯用的方式来实现此目的?
sum
,您可能需要提供一些不同类型的示例。
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
以使其在内存方面恒定。
sum
还不够好吗?