How to Split a List Into Evenly Sized Lists in Python

This article is a look at Python lists and how to split them – starting with the different implementations in the standard Python and then looking at list comprehension of Python.

The solutions described in this article will work for lists of ints, strings, lists and other objects.

Short summary of the articles examples:

Solution 1: Python split list with itertools

We'll begin with the itertools and show how to split a list with zip_longest.

We will declare a range in Python of 21 elements and split it into groups of 4 elements. We will convert the range to a list.

As you can see from the example below in case of a smaller group - the result list will be filled with None.

import itertools as it

my_list = list(range(21))
n = 4

list(it.zip_longest(*[iter(my_list)] * n))

result:

[(0, 1, 2, 3),
 (4, 5, 6, 7),
 (8, 9, 10, 11),
 (12, 13, 14, 15),
 (16, 17, 18, 19),
 (20, None, None, None)]

Solution 2: Python split list with list comprehension

Another alternative to split lists into equal chunks is to use Python list comprehensions.

In this case we are going to split a list of 21 elements into lists of 5 elements each.

my_list = list(range(21))
n = 5

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

result:

[[0, 1, 2, 3, 4],
 [5, 6, 7, 8, 9],
 [10, 11, 12, 13, 14],
 [15, 16, 17, 18, 19],
 [20]]

The difference to the previous solutions is that the last list will have only elements from the initial list.

Solution 3: Python split list with numpy

My favourite solution is coming from numpy. There are two methods which can split array or list:

  • np.split
  • np.array_split

They can split list in a different way:

np.array_split defines the total number of chunks, not the number of elements per chunk.

So if we like to split 23 elements into 5 groups:

import numpy as np

my_list = list(range(23))
np.array_split(my_list, 5)

we will get 3 lists of 5 elements and 2 of 4 elements:

[array([0, 1, 2, 3, 4]),
 array([5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14]),
 array([15, 16, 17, 18]),
 array([19, 20, 21, 22])]

np.split gets indices_or_sections. So in order to split the same list of 23 items into 5 lists we can use:

n = 5
np.split(my_list, range(n, n*n, n))

which results into:

[array([0, 1, 2, 3, 4]),
 array([5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14]),
 array([15, 16, 17, 18, 19]),
 array([20, 21, 22])]

How does it work? We are giving the list and the indices where we would like to break the list.

So if we like to get chunks of 5 items per sublist we are going to generate indices as follow:

range(5, 25, 5)

output:

[5, 10, 15, 20]

Solution 4: Python split list with zip

One more option is to split lists in Python with zip. The solution seems to be a simple one as:

my_list = list(range(15))
n = 3

list(zip(*[iter(my_list)]*n))

which will produce:

[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]

but in case of not evenly spread elements will produce unexpected results as:

my_list = list(range(17))
n = 3

list(zip(*[iter(my_list)]*n))

result:

[(0, 1, 2), (3, 4, 5), (6, 7, 8), (9, 10, 11), (12, 13, 14)]