これが私にできる最善のことです。「コレクション」がスライス可能であることを期待しています。
def myreduce(func,collection,*args):
"""func takes 3 parameters. The previous value,
the current value, and the rest of the collection"""
def new_func(x,y):
try:
return func(x[1],y[1],collection[y[0]:])
except TypeError:
return func(x,y[1],collection[y[0]:])
return reduce(new_func,enumerate(collection),*args)
print myreduce(lambda x,y,rest:x+y+sum(rest),range(30))
これは十分にテストされていないことに注意してください。実際のコードでこれを使用する前に、徹底的にテストしてください。本当にこれを任意の反復可能で機能させたい場合は、私が推測する上部にそこに置くことができcollection = tuple(collection)
ます(反復可能全体を一度にメモリに格納するのに十分なメモリがあると仮定します)