a sequence question

Roy Smith roy at panix.com
Fri Jan 28 09:27:17 EST 2005


In article <lzrKd.138680$K7.56500 at news-server.bigpond.net.au>,
 Chris Wright <wrightca at hotmail.com> wrote:

> Hi,
> 
> 1) I want to iterate over a list "N at a time"

You could do it with slicing and zip:

>>> l = [1, 2, 3, 4, 5, 6, 7, 8]
>>> zip (l[::2], l[1::2])
[(1, 2), (3, 4), (5, 6), (7, 8)]

To my eyes, that's a bit cryptic, but it works and it's certainly 
compact.  I don't use either zip() or extended slicing a lot; perhaps if 
I used them more often, the above would be more obvious to me if I read 
it in somebody else's code.

The interesting thing would be generalizing this to the "N at a time" 
case.  I think this works:

def nzip (list0, n):
    args = []
    for i in range(n):
        slice = list0[i::n]
        args.append (slice)
    return zip (*args)

l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
print nzip (l, 3)

Roy-Smiths-Computer:play$ ./nzip.py
[(1, 2, 3), (4, 5, 6), (7, 8, 9), (10, 11, 12)]

but I haven't given any thought to what happens if the length of the 
list isn't a multiple of n (exercise for the reader).  It's also 
annoying that the above generates a bunch of temporary lists.  It would 
be cool if there was a way to have the intermediates be generator 
expressions, but I'm not that good with that stuff, so I'll leave that 
as an exercise for other readers :-)



More information about the Python-list mailing list