How to Create a Two Dimensional List in Python


The need to create two dimensional (2D) lists and arrays is quite common in any programming languages. I happen to be working in Python when I most recently came across this question.

Suppose I wanted to create a 2D list, or matrix, like this:

1, 1, 1, 1, 1
1, 1, 1, 1, 1
1, 1, 1, 1, 1
1, 1, 1, 1, 1
1, 1, 1, 1, 1

In memory, a 2D list looks like a list of lists.

[
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
]

We can create a list just using [], but we can’t use [][] to create a 2D list.

The following ways, both of which use list comprehension, have worked for me.

Method 1

matrix = [[1 for i in range(5)] for j in range(5)]

In this method, we’re first creating a list [1, 1, 1, 1, 1] in left for loop.

We’re then creating the list of lists, or 2D list, using the right loop.

Method 2

matrix = [x[:] for x in [[1] * 5] * 5]

On the right side, [[1] * 5] * 5] creates a 2D list that looks normal.

[
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1],
]

However, it actually creates a list of the exact same list object 5 times. This means that modifying the first element in one row will change the first element in every row of that list.

[
    [0, 1, 1, 1, 1],
    [0, 1, 1, 1, 1],
    [0, 1, 1, 1, 1],
    [0, 1, 1, 1, 1],
]

To circumvent this issue, we can make shallow copies of each row using x[:], and store it into a new list object.

Do note that this method is faster than Method 1.