reducel, reducer
ふむ。Python でやってみるべ。
sequence だけを対象にするなら、簡単。さすがに10分もいらない。
def reducel(func, l): result = l[0] for item in l[1:]: result = func(result, item) return result def reducer(func, l): result = l[-1] for item in reversed(l[:-1]): result = func(item, result) return result if __name__ == '__main__': print reducel(lambda x, y: '(%s#%s)' % (x, y), range(1, 4 + 1)) print reducer(lambda x, y: '(%s#%s)' % (x, y), range(1, 4 + 1))
さて、汎用的に iterable なデータすべてを対象にしようとするとどうなるか。reducel は簡単にできる。
def ireducel(func, l): it = iter(l) try: result = it.next() except StopIteration: raise TypeError('reducel requires non-empty elements') for item in it: result = func(result, item) return result
reducer も非 sequence で iterable なデータを相手にできるけど、 reducel と違って最後から評価する必要があるので、対象データを結局全部メモリに載せる必要がある。なので、結局は
def ireducer(func, l): return reducer(func, tuple(l))
とするしかないような気がする。