Двумерные списки

Создание двумерного списка

Двумерный список — это список, внутри которого хранятся другие списки. Создается он очень просто:


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)


2
0 9 1 5
1 0 2 0
0 3 1 0

Создание матрицы n x m

Теперь представим, что нам нужно заполнить матрицу 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)


0 0 1 0
0 0 1 0
0 0 1 0

Изменилась не только вторая строка, но и все остальные. Так произошло, потому что после повторения списка каждая строка указывает на один и тот же массив.

Чтобы этого избежать, нужно использовать генератор списков


In [12]:
n, m = 3, 4
matrix = [[0] * m for i in range(n)]

matrix[1][2] = 1

for row in matrix:
    print(*row)


0 0 0 0
0 0 1 0
0 0 0 0

Ввод матрицы

Обычно матрица задаётся в таком виде:

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())))


3 4
1 2 3 0
5 7 9 2
1 2 1 1

Или более кратко с помощью генератора списка:


In [14]:
n, m = map(int, input().split())
matrix = [list(map(int, input().split())) for i in range(n)]


3 4
1 2 3 0
5 7 9 2
1 2 1 1