Двумерный список — это список, внутри которого хранятся другие списки. Создается он очень просто:
In [4]:
lst_2d = [
[2, 4, 'unicorn'],
[False, 39],
[None],
]
Похожим образом можно сделать трёхмерный список.
In [2]:
lst_3d = [
[[1, 1, 2], [3, 5], [8, 13]],
[[21, 34], [55]]
]
Чаще всего используются двумерные списки с равным количеством элементов в каждой строке. Такой двумерный список можно называть матрицей.
In [7]:
matrix = [
[0, 0, 1, 5],
[1, 0, 2, 0],
[0, 3, 1, 0],
]
Изменить или получить элемент матрицы можно так:
In [8]:
matrix = [
[0, 0, 1, 5],
[1, 0, 2, 0],
[0, 3, 1, 0],
]
print(matrix[1][2])
matrix[0][1] = 9
for row in matrix:
print(*row)
Теперь представим, что нам нужно заполнить матрицу c n
строками и m
столбцами нулями. Интуитивным выглядит такой способ:
In [4]:
n, m = 3, 4
matrix = [[0] * m] * n
Но не все так просто...
In [9]:
n, m = 3, 4
matrix = [[0] * m] * n
# Изменяем третий элемент во второй строке
matrix[1][2] = 1
for row in matrix:
print(*row)
Изменилась не только вторая строка, но и все остальные. Так произошло, потому что после повторения списка каждая строка указывает на один и тот же массив.
Чтобы этого избежать, нужно использовать генератор списков
In [12]:
n, m = 3, 4
matrix = [[0] * m for i in range(n)]
matrix[1][2] = 1
for row in matrix:
print(*row)
Обычно матрица задаётся в таком виде:
3 4
1 2 3 0
5 7 9 2
1 2 1 1
Превые два числа — количество строк и столбцов.
Считывать это можно так:
In [15]:
n, m = map(int, input().split())
matrix = []
for i in range(n):
matrix.append(list(map(int, input().split())))
Или более кратко с помощью генератора списка:
In [14]:
n, m = map(int, input().split())
matrix = [list(map(int, input().split())) for i in range(n)]