indexed looping, functional replacement?
Bengt Richter
bokr at oz.net
Sun Nov 10 10:29:11 EST 2002
On Sun, 10 Nov 2002 10:34:50 GMT, Alex Martelli <aleax at aleax.it> wrote:
>Bengt Richter wrote:
> ...
>> also a lazy zip, to avoid building lists you don't use (untested beyond
>> what you see ;-)
>>
>> >>> from __future__ import generators
>> >>> def xzip(*args):
>> ... for i in xrange(min(map(len,args))):
>> ... yield tuple([x[i] for x in args])
>> ...
>> >>> for f,s in xzip(fl,sl):
>> ... f(s)
>> ...
>> f1: bbb
>> f2: sdf
>> f3: sdw
>
>I think that xzip can be simplified a bit -- as code, the for
>statement is threateningly complex, and the tupleization of the
>yielded sublists just a bit of conceptual and runtime overhead,
>for most practical purposes. So, I might code it, instead:
>
>def xzip(*args):
> iters = map(iter, args)
> while True:
> yield [x.next() for x in iters]
>
Very nice.
>the key idea here is that the first iterator to run out will
>let the fact be known by raising StopIteration, and xzip just
>lets that exception propagate, thus in turn letting its caller
>know that xzip has also run out of items to iterate on.
>
>
>Of course, the semantics are slightly different. The original
>xzip needs arguments that are sequences (i.e., can be passed to
>'len', and indexed by integers 0 and up), while this simpler one
>accepts arguments that are iterable (can be subjected to iter).
>All sequences are iterable, but not vice versa (file objects open
>for reading, for example, are iterable, but not sequences).
>
>So, for example, this simpler xzip could be used to print out
>a textfile's lines with numbering:
>
>for line, linenumber in xzip(open('the.txt'), xrange(sys.maxint)):
> print '%d: %s' % (linenumber, line),
>
>while the original would die with a TypeError if used in this
>way (the file object can be iterated on, but not indexed, nor
>can it be passed as the argument to built-in 'len'). However,
>it seems to me that the simpler xzip's greater generality is
>not a substantial problem -- simplicity IS nice to have.
>
Yes, lovely.
Regards,
Bengt Richter
More information about the Python-list
mailing list