Матрицы на Python: от основ до продвинутых техник

Раздел: Списки -> Многомерные структуры данных

Двумерные списки в Python: основные концепции и типовые решения

Как создать двумерный список с независимыми строками?

Наиболее эффективный и безопасный способ - использование генератора списков. Каждая строка создаётся отдельно, поэтому изменение одной строки не влияет на другие.

rows, cols = 3, 4
matrix = [[0 for _ in range(cols)] for _ in range(rows)]
print(matrix)

Python двумерный (двумерные списки в python)

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

Как создать двумерный список с помощью вложенных циклов?

rows, cols = 3, 4
matrix = []
for i in range(rows):
    row = []
    for j in range(cols):
        row.append(0)
    matrix.append(row)
print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

Этот метод нагляднее, но требует больше кода. Он удобен, когда нужно выполнять дополнительные действия при заполнении ячеек, например ввод с клавиатуры.

Почему операция умножения списка не подходит для создания матрицы?

rows, cols = 3, 4
matrix = [[0]*cols]*rows
print(matrix)
matrix[0][0] = 1
print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]

При использовании [[0]*cols]*rows все строки ссылаются на один и тот же внутренний список. Изменение любого элемента отражается во всех строках. Чтобы избежать этой проблемы, следует создавать независимые списки, например с помощью генератора или явных циклов.

Как получить доступ к элементу матрицы?

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
element = matrix[1][2]
print(element)
6

Индексация начинается с нуля: matrix[строка][столбец].

Как получить все элементы с помощью двойного цикла?

for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        print(matrix[i][j], end=' ')
    print()
1 2 3 
4 5 6 
7 8 9

Как изменить значение элемента?

matrix[0][1] = 10
print(matrix)
[[1, 10, 3], [4, 5, 6], [7, 8, 9]]

Как добавить новую строку в матрицу?

matrix.append([10, 11, 12])
print(matrix)
[[1, 10, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

Метод append добавляет строку в конец.

Как вставить строку в произвольное место?

matrix.insert(1, [0, 0, 0])
print(matrix)
[[1, 10, 3], [0, 0, 0], [4, 5, 6], [7, 8, 9], [10, 11, 12]]

Как добавить новый столбец в матрицу?

Необходимо пройти по всем строкам и добавить элемент в каждую.

new_col = [10, 20, 30, 40]  # длина должна совпадать с числом строк
for i in range(len(matrix)):
    matrix[i].append(new_col[i])
print(matrix)
[[1, 10, 3, 10], [0, 0, 0, 20], [4, 5, 6, 30], [7, 8, 9, 40], [10, 11, 12, 40]]

Если длина new_col не равна числу строк, возникнет ошибка IndexError. Перед добавлением стоит проверять размеры.

Как удалить строку или столбец?

Удаление строки выполняется с помощью del или pop.

del matrix[0]  # удаляет первую строку
print(matrix)
removed_row = matrix.pop(2)  # удаляет строку с индексом 2
print(removed_row)
[[0, 0, 0, 20], [4, 5, 6, 30], [7, 8, 9, 40], [10, 11, 12, 40]]
[7, 8, 9, 40]

Как удалить столбец?

Удаление столбца требует перебора всех строк и применения del к каждому элементу с заданным индексом.

col_index = 2
for row in matrix:
    del row[col_index]
print(matrix)
[[0, 0, 20], [4, 5, 30], [10, 11, 40]]

Как обойти все элементы матрицы?

for row in matrix:
    for value in row:
        print(value, end=' ')
    print()
0 0 20 
4 5 30 
10 11 40

Как обойти матрицу с индексами?

for i, row in enumerate(matrix):
    for j, value in enumerate(row):
        print(f'[{i},{j}] = {value}')

Как транспонировать матрицу?

Использование встроенной функции zip с распаковкой.

matrix = [[1, 2, 3], [4, 5, 6]]
transposed = [list(row) for row in zip(*matrix)]
print(transposed)
[[1, 4], [2, 5], [3, 6]]

Как транспонировать матрицу с помощью вложенных циклов?

rows = len(matrix)
cols = len(matrix[0])
transposed = [[0]*rows for _ in range(cols)]
for i in range(rows):
    for j in range(cols):
        transposed[j][i] = matrix[i][j]
print(transposed)
[[1, 4], [2, 5], [3, 6]]

Как правильно скопировать двумерный список?

Для независимой копии используется copy.deepcopy либо генератор списков.

import copy
original = [[1, 2], [3, 4]]
copy1 = copy.deepcopy(original)
copy2 = [row[:] for row in original]  # поверхностное копирование строк с помощью среза
copy1[0][0] = 99
print(original, copy1, copy2, sep='\n')
[[1, 2], [3, 4]]
[[99, 2], [3, 4]]
[[1, 2], [3, 4]]

Внимание: обычное копирование через original.copy() создаёт только новый внешний список, внутренние остаются общими.

bad_copy = original.copy()
bad_copy[0][0] = 77
print(original)
[[77, 2], [3, 4]]

Расширенные примеры работы с двумерными списками

Как выполнить умножение двух матриц?

Пример
def matrix_mult(A, B):
    # проверка согласованности размеров
    if len(A[0]) != len(B):
        raise ValueError('Несогласованные размеры матриц')
    result = [[0 for _ in range(len(B[0]))] for _ in range(len(A))]
    for i in range(len(A)):
        for j in range(len(B[0])):
            for k in range(len(B)):
                result[i][j] += A[i][k] * B[k][j]
    return result

A = [[1, 2], [3, 4]]
B = [[5, 6], [7, 8]]
print(matrix_mult(A, B))
[[19, 22], [43, 50]]

Как сгенерировать матрицу случайных чисел?

Пример
import random
rows, cols = 4, 3
matrix = [[random.randint(1, 10) for _ in range(cols)] for _ in range(rows)]
for row in matrix:
    print(row)
[7, 2, 9]
[1, 5, 6]
[3, 8, 4]
[2, 9, 1]

Как найти максимальный элемент в каждой строке?

Пример
matrix = [[1, 5, 3], [9, 2, 8], [4, 7, 0]]
max_in_rows = [max(row) for row in matrix]
print(max_in_rows)
[5, 9, 7]

Как построить матрицу таблицы умножения?

Пример
size = 5
matrix = [[i*j for j in range(size)] for i in range(size)]
for row in matrix:
    print(row)
[0, 0, 0, 0, 0]
[0, 1, 2, 3, 4]
[0, 2, 4, 6, 8]
[0, 3, 6, 9, 12]
[0, 4, 8, 12, 16]

Как прочитать матрицу из строки ввода?

Пример
n = int(input('Количество строк: '))
matrix = []
for _ in range(n):
    row = list(map(int, input().split()))
    matrix.append(row)
print(matrix)
Ввод:
3
1 2 3
4 5 6
7 8 9
Вывод: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Как вычислить сумму элементов всей матрицы?

Пример
matrix = [[1, 2, 3], [4, 5, 6]]
total = sum(sum(row) for row in matrix)
print(total)
21

Как преобразовать список строк в матрицу символов?

Пример
strings = ['abc', 'def', 'ghi']
matrix = [list(s) for s in strings]
print(matrix)
[['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h', 'i']]

Как выполнить поворот матрицы на 90 градусов по часовой стрелке?

Пример
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
rotated = [list(row) for row in zip(*matrix[::-1])]
print(rotated)
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]

Как удалить дубликаты строк из матрицы?

Пример
matrix = [[1,2], [3,4], [1,2], [5,6]]
unique = [list(x) for x in {tuple(row) for row in matrix}]
print(unique)
[[5, 6], [1, 2], [3, 4]]

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

En
Python двумерный (python)