reduce()--what is it good for? (was: Re: reduce() anomaly?)
Bengt Richter
bokr at oz.net
Fri Nov 7 05:27:05 EST 2003
On Thu, 06 Nov 2003 21:57:33 -0800, David Eppstein <eppstein at ics.uci.edu> wrote:
>In article <mailman.507.1068171071.702.python-list at python.org>,
> Bob Gailer <bgailer at alum.rpi.edu> wrote:
>
>> To expand your reduce horizons in Python, consider reduce as a way to
>> examine the relationship between successive pairs of a sequence. For
>> example one might wants the difference between successive elements: given
>> seq = [1,3,4,7] we'd like a differences == [2,1,3].
>>
>> differences = []
>> def neighborDifference(left, right):
>> differences.append(right - left)
>> return right
>> reduce(neighborDifference, seq)
(IMO that's an ugly way to get a global result ;-).
>
>seq=[1,3,4,7]
>[y-x for x,y in zip(seq,seq[1:])]
The OP might like to see how generators make this sort of thing easy, e.g.,
>>> def pairs(seq):
... itseq = iter(seq)
... earlier = itseq.next()
... for later in itseq:
... yield earlier, later
... earlier = later
...
>>> seq = [1,3,4,7]
Reincarnating your list comprehension, kind of:
>>> [later-earlier for earlier,later in pairs(seq)]
[2, 1, 3]
or factoring out the first difference ...
>>> def diff1(seq):
... for earlier,later in pairs(seq): yield later-earlier
...
that becomes
>>> [d for d in diff1(seq)]
[2, 1, 3]
or perhaps better
>>> list(diff1(seq))
[2, 1, 3]
And then we can play with other kinds of sequences and first differences, e.g.,
>>> linetext = """\
... abc
... abx
... bx
... zax
... """
>>> import sets
>>> for d in diff1([sets.Set(line) for line in linetext.splitlines()]): print d
...
Set(['x'])
Set([])
Set(['a', 'z'])
That was the first differences of:
>>> for d in ([sets.Set(line) for line in linetext.splitlines()]): print d
...
Set(['a', 'c', 'b'])
Set(['a', 'x', 'b'])
Set(['x', 'b'])
Set(['a', 'x', 'z'])
Regards,
Bengt Richter
More information about the Python-list
mailing list