ela*_*sca 17 python haskell functional-programming
我想知道python中是否有内置函数用于等效的Haskell scanl,reduce相当于foldl.
这样做的东西:
Prelude> scanl (+) 0 [1 ..10]
[0,1,3,6,10,15,21,28,36,45,55]
Run Code Online (Sandbox Code Playgroud)
问题不在于如何实现它,我已经有2个实现,如下所示(但是,如果你有一个更优雅的实现,请随时在这里显示).
首次实施:
# Inefficient, uses reduce multiple times
def scanl(f, base, l):
ls = [l[0:i] for i in range(1, len(l) + 1)]
return [base] + [reduce(f, x, base) for x in ls]
print scanl(operator.add, 0, range(1, 11))
Run Code Online (Sandbox Code Playgroud)
得到:
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
Run Code Online (Sandbox Code Playgroud)
第二次实施:
# Efficient, using an accumulator
def scanl2(f, base, l):
res = [base]
acc = base
for x in l:
acc = f(acc, x)
res += [acc]
return res
print scanl2(operator.add, 0, range(1, 11))
Run Code Online (Sandbox Code Playgroud)
得到:
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
Run Code Online (Sandbox Code Playgroud)
谢谢 :)
man*_*lds 17
你可以使用它,如果它更优雅:
def scanl(f, base, l):
for x in l:
base = f(base, x)
yield base
Run Code Online (Sandbox Code Playgroud)
使用它像:
import operator
list(scanl(operator.add, 0, range(1,11)))
Run Code Online (Sandbox Code Playgroud)
Python 3.x有itertools.accumulate(iterable, func= operator.add).它的实现如下.实施可能会给你一些想法:
def accumulate(iterable, func=operator.add):
'Return running totals'
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
total = next(it)
yield total
for element in it:
total = func(total, element)
yield total
Run Code Online (Sandbox Code Playgroud)
开始Python 3.8,并引入赋值表达式(PEP 572)(:=运算符),它提供了命名表达式结果的可能性,我们可以使用列表理解来复制左扫描操作:
acc = 0
scanned = [acc := acc + x for x in [1, 2, 3, 4, 5]]
# scanned = [1, 3, 6, 10, 15]
Run Code Online (Sandbox Code Playgroud)
或者以通用方式,给定一个列表、一个归约函数和一个初始化的累加器:
items = [1, 2, 3, 4, 5]
f = lambda acc, x: acc + x
accumulator = 0
Run Code Online (Sandbox Code Playgroud)
我们可以items从左侧扫描并使用以下方法减少它们f:
scanned = [accumulator := f(accumulator, x) for x in items]
# scanned = [1, 3, 6, 10, 15]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2398 次 |
| 最近记录: |