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