Theory and Tasks for Students - Spring 2019
Матрицы

В отличие от некоторых других языков программирования, в Питоне нет понятия многомерного массива/матрицы. Такая структура реализуется вложением списков друг в друга - таким образом, например, список [[0, 0], [0, 0], [0, 0], [0, 0]] можно считать матрицей из 4 строк и 2 столбцов. В общем случае матрицу можно задать следующий образом: a = [([0] * k) for i in range(n)]; # n строк по k столбцов Обратите внимание, что следующий вариант не будет являться правильным, т.к. оператор умножения будет копировать ссылку на список, а не его содержание, что легко проверяется: b = [[0] * 3] * 2; b[0][0] = 1; print(b); # [[1, 0, 0], [1, 0, 0]] Таким образом первый оператор индексации возвращает список-строку матрицы, а второй - элемент этой строки.

Вывод матрицы - и многомерного массива любой размерности - можно производить следующим образом, пользуясь тем, каждое измерение - список: res = "" for row in a : for item in row : res += str(item) + " "; res += "\n"; print(res);

Для заполнения матрицы придётся использовать индексы: counter = 0; for i in range(len(a)) : # len(a) вернёт число строк for j in range(len(a[i])) : # len(a[i]) - длина i-той строки a[i][j] = counter; counter += 1; Этот блок кода заполнит массив следующим образом: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Чуть более сложный пример - заполнение двумерного массива "змейкой": 0 1 2 3 4 9 8 7 6 5 10 11 12 13 14 19 18 17 16 15 counter = 0; for i in range(len(a)) : for j in range(len(a[i])) : if (i % 2 == 0) : a[i][j] = counter; else : a[i][len(arr[i]) - 1 - j] = counter; counter += 1;

Очевидно, так же можно определить разные функции для работы с матрицами, например, сложение матриц: def My_MatrixAdd(a, b) : # возникает проблема - нельзя гарантировать правильность размеров матриц без прохода по ним if ((len(a) != len(b)) or (len(a[0]) != len(b[0]))) : return False; c = [([0] * len(a[0])) for i in range(len(a))]; for i in range(len(c)) : for j i in range(len(c[i])) : c[i][j] = a[i][j] + b[i][j]; return c; # альтерантивный вариант # return [[(a[i][j] + b[i][j]) for j in range(len(a[0]))] for i in range(len(a))]