indexed() generator
Delaney, Timothy
tdelaney at avaya.com
Tue Jan 22 20:52:14 EST 2002
> From: Jason Orendorff [mailto:jason at jorendorff.com]
>
> Here's a builtin candidate for discussion.
> A common Python idiom goes like this:
>
> for i in range(len(seq)):
> obj = seq[i]
> ...
> ...
>
> People have complained that this is clunky.
> But with this:
>
> from __future__ import generators
>
> def indexed(src):
> i = 0
> for obj in src:
> yield i, obj
> i += 1
This has been discussed before, though I think it was dealing with iterators
rather than generators.
A perhaps better method would be:
def indexed (seq, start=0)
i = start
for obj in seq:
yield i, obj
i += 1
(sometimes a non-zero start index is wanted).
With a comparison between a generator and an iterator version ...
from __future__ import generators
def indexedGen (seq, start=0):
i = start
for obj in seq:
yield i, obj
i += 1
class indexedIter:
def __init__(self, iterable, start=0):
self.iter = iter(iterable)
self.i = start
def __iter__(self):
return self
def next (self):
i, value = self.i, self.iter.next()
self.i += 1
return i, value
seq = [1, 2, 3]
for i, j in indexedGen(seq):
print i, j
print
for i, j in indexedGen(seq, 5):
print i, j
print
for i, j in indexedIter(seq):
print i, j
print
for i, j in indexedIter(seq, 5):
print i, j
the generator is much shorter, and nicer to read.
Tim Delaney
More information about the Python-list
mailing list