How do you split a list into evenly sized chunks? How do you split a list into evenly sized chunks? python python

How do you split a list into evenly sized chunks?


Here's a generator that yields the chunks you want:

def chunks(lst, n):    """Yield successive n-sized chunks from lst."""    for i in range(0, len(lst), n):        yield lst[i:i + n]

import pprintpprint.pprint(list(chunks(range(10, 75), 10)))[[10, 11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47, 48, 49], [50, 51, 52, 53, 54, 55, 56, 57, 58, 59], [60, 61, 62, 63, 64, 65, 66, 67, 68, 69], [70, 71, 72, 73, 74]]

If you're using Python 2, you should use xrange() instead of range():

def chunks(lst, n):    """Yield successive n-sized chunks from lst."""    for i in xrange(0, len(lst), n):        yield lst[i:i + n]

Also you can simply use list comprehension instead of writing a function, though it's a good idea to encapsulate operations like this in named functions so that your code is easier to understand. Python 3:

[lst[i:i + n] for i in range(0, len(lst), n)]

Python 2 version:

[lst[i:i + n] for i in xrange(0, len(lst), n)]


If you want something super simple:

def chunks(l, n):    n = max(1, n)    return (l[i:i+n] for i in range(0, len(l), n))

Use xrange() instead of range() in the case of Python 2.x


Directly from the (old) Python documentation (recipes for itertools):

from itertools import izip, chain, repeatdef grouper(n, iterable, padvalue=None):    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"    return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)

The current version, as suggested by J.F.Sebastian:

#from itertools import izip_longest as zip_longest # for Python 2.xfrom itertools import zip_longest # for Python 3.x#from six.moves import zip_longest # for both (uses the six compat library)def grouper(n, iterable, padvalue=None):    "grouper(3, 'abcdefg', 'x') --> ('a','b','c'), ('d','e','f'), ('g','x','x')"    return zip_longest(*[iter(iterable)]*n, fillvalue=padvalue)

I guess Guido's time machine works—worked—will work—will have worked—was working again.

These solutions work because [iter(iterable)]*n (or the equivalent in the earlier version) creates one iterator, repeated n times in the list. izip_longest then effectively performs a round-robin of "each" iterator; because this is the same iterator, it is advanced by each such call, resulting in each such zip-roundrobin generating one tuple of n items.