Breaking Python list into set-length list of lists
Gerard Flanagan
grflanagan at gmail.com
Thu Feb 12 02:46:47 EST 2009
Jason wrote:
> Hey everyone--
>
> I'm pretty new to Python, & I need to do something that's incredibly
> simple, but combing my Python Cookbook & googling hasn't helped me out
> too much yet, and my brain is very, very tired & flaccid @ the
> moment....
>
> I have a list of objects, simply called "list". I need to break it
> into an array (list of lists) wherein each sublist is the length of
> the variable "items_per_page". So array[0] would go from array[0][0]
> to array[0][items_per_page], then bump up to array[1][0] - array[1]
> [items_per_page], until all the items in the original list were
> accounted for.
>
If you need to pad the last item:
def chunk( seq, size, pad=None ):
'''
Slice a list into consecutive disjoint 'chunks' of
length equal to size. The last chunk is padded if necessary.
>>> list(chunk(range(1,10),3))
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> list(chunk(range(1,9),3))
[[1, 2, 3], [4, 5, 6], [7, 8, None]]
>>> list(chunk(range(1,8),3))
[[1, 2, 3], [4, 5, 6], [7, None, None]]
>>> list(chunk(range(1,10),1))
[[1], [2], [3], [4], [5], [6], [7], [8], [9]]
>>> list(chunk(range(1,10),9))
[[1, 2, 3, 4, 5, 6, 7, 8, 9]]
>>> for X in chunk([],3): print X
>>>
'''
n = len(seq)
mod = n % size
for i in xrange(0, n-mod, size):
yield seq[i:i+size]
if mod:
padding = [pad] * (size-mod)
yield seq[-mod:] + padding
If you search the list archive, there is surely an example which will do
the same for an arbitrary iterable (in general, you can't assume that
`len(seq)` will work for an iterable that is not a list, set or tuple).
But if you are just starting with Python, don't worry about this.
More information about the Python-list
mailing list