better way to write this function

Peter Otten __peter__ at web.de
Mon Nov 26 03:19:21 EST 2007


Kelie wrote:

> Hello,
> 
> This function does I what I want. But I'm wondering if there is an
> easier/better way. To be honest, I don't have a good understanding of
> what "pythonic" means yet.
> 
> def divide_list(lst, n):
>     """Divide a list into a number of lists, each with n items. Extra
> items are
>        ignored, if any."""
>     cnt = len(lst) / n
>     rv =  [[None for i in range(n)] for i in range(cnt)]
>     for i in range(cnt):
>         for j in range(n):
>             rv[i][j] = lst[i * n + j]
>     return rv

You can use slicing:

>>> def chunks(items, n):
...     return [items[start:start+n] for n in range(0, len(items)-n+1, n)]
... 
>>> for i in range(1,10):
...     print chunks(range(5), i)
... 
[[0], [1], [2], [3], [4]]
[[0, 1], [2, 3]]
[[0, 1, 2]]
[[0, 1, 2, 3]]
[[0, 1, 2, 3, 4]]
[]
[]
[]
[]

Or build a generator that works with arbitrary iterables:

>>> from itertools import *
>>> def chunks(items, n):
...     items = iter(items)
...     while 1:
...             chunk = list(islice(items, n-1))
...             chunk.append(items.next())
...             yield chunk
... 
>>> list(chunks(range(5), 2))
[[0, 1], [2, 3]]

Peter



More information about the Python-list mailing list