[David Isaac] > def cumreduce(func, seq, init = None): > if not seq: > cr = [init]*bool(init) > else: > cr = [seq[0]] * len(seq) > if init: > cr[0] = func(cr[0],init) > for idx in range(1,len(seq)): > cr[idx] = func(cr[idx-1],seq[idx]) > return cr
[Michael Spencer] > >>> import operator > >>> def ireduce(func, iterable, init): > ... for i in iterable: > ... init = func(init, i) > ... yield init > ... [David Isaac] > Right. So it is "more concise" only by being incomplete, right? > What other advantages might it have? - allows arbitrary iterables, not sequences only - smaller memory footprint if sequential access to the items is sufficient - fewer special cases, therefore - less error prone, e. g. + does your implementation work for functions with f(a, b) != f(b, a)? + won't users be surprised that cumreduce(f, [1]) == cumreduce(f, [], 1) != cumreduce(f, [0]) == cumreduce(f, [], 0) Of course nothing can beat a plain old for loop in terms of readability and -- most likely -- speed. Peter -- http://mail.python.org/mailman/listinfo/python-list