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