Статья Автор: Деникина Наталья Владимировна

Двумерные массивы (матрицы)

Очень часто при работе с какой-либо информацией приходится иметь дело с табличными данными. Современные программы очень часто работают именно с такими данными. Самый простой пример - это программирование игр на клетчатой доске: крестики-нолики, шахматы, шашки и т.п.

В математике такие структуры называются матрицами.
 
Матрица - это прямоугольная таблица, составленная из элементов одного типа (чисел, строк и т.д).

Такие данные на языке Python можно хранить и обрабатывать в виде двумерных списков (двумерных массивов) - "список списков".
Чтобы обработать данные в таблице, надо запоминать состояние каждой ячейки (клетки). Каждая ячейка имеет два номера: номер строки и номер столбца.
В матрице каждый элемент имеет два индекса: сначала указывается номер строки, затем номер столбца. Нумерация строк и столбцов начинается с нуля.
Например, элемент A[1][2] - это элемент расположенный во второй строке и третьем столбце.
Также, как и с обычными массивами (списками), для того, чтобы работать с матрицами, необходимо научиться их создавать, вводить, обрабатывать и выводить на экран.

 

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

Вариант 1. Строгое задание элементов матрицы
Если известны все значения матрицы, то ее можно записать следующим образом (для таблицы, указанной выше):
 
arr = [ [1, 2, 4, 29],
        [3, 4, 6, 1] ]

или в одну строку
arr = [[1, 2, 4, 29], [3, 4, 6, 1]]

Первый способ более нагляден, лучше читается и воспринимается.
Обратите внимание, значения элементов каждой строки располагаются в квадратных скобках.
 
Вариант 2. Создание в памяти матрицы заданного размера, заполненной некоторыми начальными значениями (например, нулями)
НЕВЕРНЫЙ способ (так делать точно не надо)
 
N = 3
M = 2
row = [0] * M  # создаем список-строку длиной M
A = [row] * N  # создаем массив (список) из N строк

Такой способ будет работать неверно из-за особенностей Python. 
Если потом необходимо будет сделать присваивание A[0][0] = 1, то в результате все элементы нулевого столбца будет равны 1
Вывод матрицы А на экран командой print(A) даст результат (проверьте это самостоятельно):
[[1, 0], [1, 0], [1, 0]]

Это произошло из-за того, что матрица - это список адресов строк

То есть, выполняя оператор
row = [0] * M 
компилятор создаст в памяти одну единственную строку, а затем оператор
A = [row] * N 
устанавливает на эту строку все ссылки в массиве А.

 
ВАЖНО!
Чтобы создать правильно матрицу, необходимо заставить компилятор создать все строки в памяти как разные объекты. Для этого необходимо сначала создать пустой список, а затем в цикле добавлять к нему новые строки с помощью метода append().
 
Пример


сделать то же самое можно с помощью генератора


В списочных выражениях можно использовать вложенные циклы. Считаем с клавиатуры матрицу целых чисел размерностью 5 на 5 (5 строк, 5 столбца). Числа в строке разделены пробелом, количество строк равно 5. При этом программа не следит за количеством чисел в строке, так как используется метод split(); поэтому в общем случае приведённая программа может считать не матрицу в математическом смысле, а вложенный список.


Списочное выражение в примере можно прочитать так: "запусти цикл из пяти итераций и на каждой итерации прочитай строку с клавиатуры, преобразуй её в список элементов, а затем пройди по этому списку строк и каждый элемент преобразуй в целое число; добавь полученный список целых чисел в конец результирующего списка".
Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать