Матрицы на 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]]