- Введение в программирование на языке Python. 10 Модуль. Теория. Двумерные массивы.
- Копирование списков
- Создание двумерных списков
- Снежинка
- Ходы коня
- Считывание двумерных массивов
- Поменять столбцы
- Симметричен ли массив?
- Максимум
- Поменять местами две диагонали
- Транспонировать квадратную матрицу
- Python Урок 8. Матрицы (двумерный массив)
- Обработка элементов двумерного массива
Введение в программирование на языке Python. 10 Модуль. Теория. Двумерные массивы.
Часто в задачах приходится хранить прямоугольные таблицы с данными. Такие таблицы называются матрицами или двумерными массивами. В языке программирования Python таблицу можно представить в виде списка, каждый элемент которого тоже является списком, например, списком чисел.
Если требуется создать числовую таблицу из двух строк и трёх столбцов, то это можно сделать следующим образом: a = [[ 2 , 3 , 4 ] , [ 5 , 6 , 7 ]] .
Здесь первый элемент списка a [ 0 ] является списком из чисел [ 2 , 3 , 4 ] . То есть a [ 0 ][ 0 ] равно 2, a [ 0 ][ 1 ] равно 3, a [ 0 ][ 2 ] равно 4. Таким образом, чтобы обратиться к элементу, расположенному в i -й строке и j -м столбце, то надо написать a [ i ][ j ] . Также можно использовать отрицательные индексы, например, элемент a [ — 1 ][ — 1 ] нашей таблицы — это элемент из последней строки и последнего столбца, и он равен числу 7 .
Обработка и вывод списка
Для обработки и вывода списка, как правило, используются два вложенных цикла. Первый цикл перебирает все строки, второй цикл — элементы внутри строки. Например, вывести двумерный числовой список на экран построчно, разделяя числа пробелами внутри одной строки, можно так:
for i in range ( len ( a )) :
for j in range ( len ( a [ i ])) :
print ( a [ i ][ j ] , end = ‘ ‘ )
Обратим внимание на то, что пробелы будут выведены не только между числами в строке, но и после последнего элемента. При сдаче задач эти пробелы не мешают, поэтому можно об этом не беспокоиться.
Можно перебирать элементы списка не по индексу, а по значению. Тогда код вывода двумерного массива будет иметь вот такой вид:
for elem in row:
Кроме того, для вывода одной строки можно воспользоваться методом join :
print ( ‘ ‘ . join( list ( map ( str , row ))))
Наконец, можно использовать и упрощенный способ вывода списков:
for i in range ( len ( a )) :
Используем два вложенных цикла для подсчета суммы всех чисел в таблице и нахождения минимального элемента в таблице:
for i in range ( len ( a )) :
for j in range ( len ( a [ i ])) :
Для решения этой задачи можно использовать циклы не по индексам, а по элементам:
for elem in row:
Заметим, что если мы хотим параллельно изменять значения элементов в нашей таблице, то придётся использовать первый вариант. Действительно, переменная elem является дополнительной переменной, и если мы ее меняем, то элемент таблицы при этом не меняется. Таким образом, если мы хотим не только найти сумму чисел и минимум исходной таблицы, но и увеличить все элементы таблицы на 1, то для этого надо использовать первый вариант, и код будет выглядеть следующим образом:
for i in range ( len ( a )) :
for j in range ( len ( a [ i ])) :
Создание вложенных списков
Копирование списков
Научимся копировать списки в языке Python. Пусть у нас есть список a = [ 2 , 3 , 4 ] . Оказывается, что операция b = a не создаёт новый список. Такая операция делает имя b ссылкой на тот же список, на который ссылается имя a . Таким образом, a и b — это два разных имени, ссылающиеся на один список. Поэтому если мы модифицируем список a , например, добавив число 5 в конец списка: a. append( 5 ) , то модифицируется и список b .
Нам же нужно выполнить такую операцию, чтобы имя b ссылалось на список, который является копией списка a , а не на сам список a . Для этого можно использовать присваивание с использованием среза: b = a [ : ] . Также можно использовать генератор: b = [ elem for elem in a ] .
Если есть необходимость создать копию двумерного списка, то возникают дополнительные сложности. Чтобы их избежать, рекомендуется выполнять копирование с использованием специальных функций из модуля copy . Подключить модуль copy можно, написав from copy import * в начале программы.
Создание двумерных списков
Пусть теперь нам нужно создать двумерный список из 3 строк и 4 столбцов, заполненный нулями. Кажется, что такой двумерный список можно создать следующим образом: a = [[ 0 ] * 4 ] * 3 . Но тут возникает проблема. При таком способе a [ 0 ] , a [ 1 ] и a [ 2 ] являются ссылками на один и тот же список [ 0 ] * 4 . Поэтому после операции a [ 0 ][ 0 ] = 1 , окажется, что элементы a [ 1 ][ 0 ] и a [ 2 ][ 0 ] тоже стали равны числу 1 .
Чтобы правильно создать двумерный список, заполненный нулями и состоящий из n строк и m столбцов, необходимо, чтобы каждая строка списка создавалась заново. Есть несколько способов сделать это.
Например, можно создать список из n нулей, а затем каждый элемент этого списка заменить на список из m нулей. Во время замены список из m нулей будет создаваться заново, поэтому каждая из n строк окажется ссылкой на свой независимый список из m нулей:
for i in range(n):
Можно создать изначально пустой список, а потом n раз добавить в конец этого списка новый элемент, который является списком из m нулей:
for i in range(n):
Также для создания двумерного списка можно использовать генератор, который создает список из n элементов, каждый из которых будет списком, состоящим из m нулей (подробнее о генераторах списков будет рассказано в следующем модуле):
a = [[0] * m for i in range(n)]
В каждом из этих трёх способов очередная строка создается независимо от остальных: заново конструируется список [ 0 ] * m , а не копируются ссылки на один и тот же список.
Снежинка
Дано нечётное число n . Создайте двумерный массив из n × n элементов, заполнив его символами «.» (каждый элемент массива является строкой из одного символа). Затем заполните символами » ∗ » среднюю строку массива, средний столбец массива, главную диагональ и побочную диагональ. Для этого не нужно использовать вложенные циклы.
В результате символы «звёздочка» в массиве должны образовывать изображение снежинки. Выведите полученный массив на экран, разделяя элементы массива пробелами.
Входные данные
В одной строчке задано число n ≤ 21 .
Выходные данные
Ходы коня
На шахматной доске стоит конь. Отметьте положение коня на доске и все клетки, которые он бьет. Клетку, где стоит конь, отметьте английской буквой “K”. Клетки, которые он бьёт, отметьте символами “*”. Остальные клетки заполните точками.
Входные данные
Программа получает на вход два числа — координаты коня на шахматной доске. Координаты вводятся на одной строке через пробел. Первое число обозначает номер строки, а второе — номер столбца. Все числа принимают значения от 1 до 8 .
Выходные данные
Выведите на экран изображение доски так, как это показано в примере. Обратите внимание, что символы в одной строке разделены пробелом.
Считывание двумерных массивов
Пусть программа получает на вход двумерный массив, состоящий из n строк и m столбцов. Научимся считывать такой массив.
Обычно в задачах нам сначала дают два числа n и m — размеры массива, а затем дают n строк, в каждой из которых записаны по m чисел, разделённых пробелами. Пример входных данных:
Сначала считаем два числа n и m , задающие размеры двумерного массива. После этого создадим пустой список a и повторим n раз следующую последовательность действий: считаем очередную строку из чисел, превратим строку в список из m чисел, разбив её по пробелам и преобразовав элементы к типу int , добавим полученный список в конец списка a .
for i in range(n):
a.append(list(map(int, input().split())))
Отметим, что для считывания нам не понадобилось значение переменной m , равное количеству столбцов массива. Но в других языках программирования это число используется при считывании, поэтому в задачах дают оба размера таблицы.
Можно организовать считывание при помощи генератора следующим образом:
a = [list(map(int, input().split())) for i in range(n)]
Поменять столбцы
Дан двумерный массив и два числа: i и j . Поменяйте в массиве столбцы с номерами i и j .
Входные данные
Программа получает на вход в первой строке размеры массива n≤100 и m≤100 , затем элементы массива, а в последней строке числа i и j .
Выходные данные
Выведите полученный массив.
Симметричен ли массив?
Дано число n и массив размером n × n. Проверьте, является ли этот массив симметричным относительно главной диагонали. Выведите слово “ YES “ , если массив симметричный, и слово “ NO ” в противном случае.
Входные данные
В первой строке дано значение n ≤ 10 . Далее идут n строк по n чисел — элементы матрицы.
Выходные данные
Максимум
Найдите индексы первого вхождения максимального элемента в двумерном массиве.
Входные данные
Программа получает на вход размеры массива n≤10 и m≤10 , затем n строк по m целых чисел, не превосходящих по модулю 231 .
Выходные данные
Выведите два числа: номер строки и номер столбца, в которых стоит наибольший элемент в двумерном массиве. Если таких элементов несколько, то выводится тот, у которого меньше номер строки, а если номера строк равны, то тот, у которого меньше номер столбца.
Поменять местами две диагонали
Дан квадратный массив. Поменяйте местами в каждом столбце элементы, стоящие на главной и побочной диагонали.
Входные данные
В первой строке дано число n ≤ 10 . Далее идут n строк по n неотрицательных целых чисел не больше 100 .
Выходные данные
Транспонировать квадратную матрицу
Дан двумерный массив размером n × n . Транспонируйте его и результат запишите в этот же массив. Вспомогательный массив использовать нельзя.
Входные данные
На первой строке входных данных задано натуральное число n ≤ 500 . В следующих n строках задано по n натуральных чисел — элементы массива.
Выходные данные
Python Урок 8. Матрицы (двумерный массив)
Для работы с матрицами в Python также используются списки. Каждый элемент списка-матрицы содержит вложенный список.
Рассмотрим пример матрицы размера 4 х 3:
matrix = [[-1, 0, 1], [-1, 0, 1], [0, 1, -1], [1, 1, -1]]
matrix = [[-1, 0, 1], [-1, 0, 1], [0, 1, -1], [1, 1, -1]]
Данный оператор можно записать в одну строку:
matrix = [[-1, 0, 1], [-1, 0, 1], [0, 1, -1], [1, 1, -1]]
matrix = [[-1, 0, 1], [-1, 0, 1], [0, 1, -1], [1, 1, -1]]
def printMatrix ( matrix ): for i in range ( len(matrix) ): for j in range ( len(matrix[i]) ): print ( "".format(matrix[i][j]), end = "" ) print ()
def printMatrix ( matrix ): for i in range ( len(matrix) ): for j in range ( len(matrix[i]) ): print ( «».format(matrix[i][j]), end = «» ) print ()
В примере i – это номер строки, а j – номер столбца;
len(matrix) – число строк в матрице.
def printMatrix ( matrix ): for row in matrix: for x in row: print ( "".format(x), end = "" ) print ()
def printMatrix ( matrix ): for row in matrix: for x in row: print ( «».format(x), end = «» ) print ()
from random import randint n, m = 3, 3 a = [[randint(1, 10) for j in range(m)] for i in range(n)] print(a)
from random import randint n, m = 3, 3 a = [[randint(1, 10) for j in range(m)] for i in range(n)] print(a)
Обработка элементов двумерного массива
Нумерация элементов двумерного массива, как и элементов одномерного массива, начинается с нуля.
Т.е. matrix[2][3] — это элемент третьей строки четвертого столбца.
p = 1 for i in range(N): for j in range(M): p *= matrix[i][j] print (p)
p = 1 for i in range(N): for j in range(M): p *= matrix[i][j] print (p)
s = 0 for row in matrix: s += sum(row) print (s)
s = 0 for row in matrix: s += sum(row) print (s)
Для поиска суммы существует стандартная функция sum.
Задание Python 8_0:
Получены значения температуры воздуха за 4 дня с трех метеостанций, расположенных в разных регионах страны:
Номер станции | 1-й день | 2-й день | 3-й день | 4-й день |
---|---|---|---|---|
1 | -8 | -14 | -19 | -18 |
2 | 25 | 28 | 26 | 20 |
3 | 11 | 18 | 20 | 25 |
Т.е. запись показаний в двумерном массиве выглядела бы так:
- Распечатать температуру на 2-й метеостанции за 4-й день и на 3-й метеостанции за 1-й день.
- Распечатать показания термометров всех метеостанций за 2-й день.
- Определить среднюю температуру на 3-й метеостанции.
- Распечатать, в какие дни и на каких метеостанциях температура была в диапазоне 24-26 градусов тепла.
Задание Python 8_1:
Написать программу поиска минимального и максимального элементов матрицы и их индексов.
Задание Python 8_2:
Написать программу, выводящую на экран строку матрицы, сумма элементов которой максимальна.
for i in range(N): # работаем с matrix[i][i]
for i in range(N): # работаем с matrix[i][i]
for i in range(N): # работаем с matrix[i][N-1-i]
for i in range(N): # работаем с matrix[i][N-1-i]
for i in range(N): c = A[i][2] A[i][2] = A[i][4] A[i][4] = c
for i in range(N): c = A[i][2] A[i][2] = A[i][4] A[i][4] = c
for i in range(N): A[i][2], A[i][4] = A[i][4], A[i][2]
for i in range(N): A[i][2], A[i][4] = A[i][4], A[i][2]
Задание Python 8_3:
Составить программу, позволяющую с помощью датчика случайных чисел сформировать матрицу размерностью N. Определить: