59

Given a list [1,2,3,4,5,6,7,8,9,10,11,12] and a specified chunk size (say 3), how can I get a list of chunks [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]?

Karl Knechtel
  • 62,466
  • 11
  • 102
  • 153
TheOne
  • 10,819
  • 20
  • 81
  • 119

5 Answers5

57

Well, the brute force answer is:

subList = [theList[n:n+N] for n in range(0, len(theList), N)]

where N is the group size (3 in your case):

>>> theList = list(range(10))
>>> N = 3
>>> subList = [theList[n:n+N] for n in range(0, len(theList), N)]
>>> subList
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]

If you want a fill value, you can do this right before the list comprehension:

tempList = theList + [fill] * N
subList = [tempList[n:n+N] for n in range(0, len(theList), N)]

Example:

>>> fill = 99
>>> tempList = theList + [fill] * N
>>> subList = [tempList[n:n+N] for n in range(0, len(theList), N)]
>>> subList
[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 99, 99]]
David Avsajanishvili
  • 7,678
  • 2
  • 22
  • 24
Mike DeSimone
  • 41,631
  • 10
  • 72
  • 96
39

You can use the grouper function from the recipes in the itertools documentation:

from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    """Collect data into fixed-length chunks or blocks.

    >>> grouper('ABCDEFG', 3, 'x')
    ['ABC', 'DEF', 'Gxx']
    """
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)
Nuno André
  • 4,739
  • 1
  • 33
  • 46
Mark Byers
  • 811,555
  • 193
  • 1,581
  • 1,452
  • 1
    I think this is the best way to do this. However, a more helpful answer would link here: http://stackoverflow.com/questions/434287/what-is-the-most-pythonic-way-to-iterate-over-a-list-in-chunks/434411#434411 , since it includes some discussion as to why this works. – phooji Feb 14 '11 at 23:38
6

How about

a = range(1,10)
n = 3
out = [a[k:k+n] for k in range(0, len(a), n)]
michael_j_ward
  • 4,369
  • 1
  • 24
  • 25
sizzzzlerz
  • 4,277
  • 3
  • 27
  • 35
5

See examples at the bottom of the itertools docs: http://docs.python.org/library/itertools.html?highlight=itertools#module-itertools

You want the "grouper" method, or something like it.

Adam Vandenberg
  • 19,991
  • 9
  • 54
  • 56
0
answer = [L[3*i:(3*i)+3] for i in range((len(L)/3) +1)]
if not answer[-1]:
    answer = answer[:-1]
inspectorG4dget
  • 110,290
  • 27
  • 149
  • 241