Доброго времени суток, читатели, зрители моего канала programmer's notes.
Данная статья это приложение к уроку 16.
Python. Двумерные списки. Задачи
На уроке я разбирал 4 задачи. Постараюсь теперь изложить это письменно, как обычно несколько расширив обсуждение.
Задача 1. Дана квадратная числовая матрица. Получить суммы элементов на ее двух главных диагоналях.
Я несколько усовершенствовал решение, которое было на видео
Лишний раз хочу отметить, что работы с индексами в двумерной матрице вообще не тривиальная вещь. Здесь может помочь только тренировка. Вот так сразу глянуть на формулу, определяющую значение индекса и понять, что это такое - не всегда просто.
Задача 2. Написать программу транспонирования матрицы.
В видео уроке была следующая программа.
Чем она меня не удовлетворяет? Необходимостью использовать еще один список. Если исходный список большой, то может понадобиться много памяти. А тут еще один такой же. Так что, есть причина несколько переделать программу.
Однако и здесь не все так просто. Если матрица не квадратная, то без второй матрицы не обойтись. Так что рассмотрим случай квадратной матрицы.
Понятно, для того, чтобы транспонировать квадратную матрицу, нужно обменивать ее элементы. При чем элементы, которые лежать выше главной диагонали, с элементами, которые лежат ниже главной диагонали. Ведь транспонирование можно рассматривать еще и как поворот вокруг главной диагонали.
Тут ключевая строка
for j in range(i + 1, n)
Если так
for j in range(0, n)
то произойдет 2 транспонирования и матрица вернется в исходное состояние. Проверьте
Задача 3. Дано число n. Создайте массив размером n×n и заполните его по следующему правилу. На главной диагонали должны быть записаны числа 0. На двух диагоналях, прилегающих к главной, числа 1. На следующих двух диагоналях числа 2, и т.д.
Решение представлено ниже
Рассмотрим некоторые элементы программы
Но, во первых
ls[i][i + j] = j
Что это. Если j = 0, то это главная диагональ. А если j = 1, то это соседняя с главной диагональю, выше ее. Соответственно
ls[i + j][i] = j
соседняя с главной, но ниже. Увеличивая j мы будем двигаться по параллельным диагоналям.
Во-вторых, с удалением от главной диагонали длины параллельных диагоналей будут уменьшаться
for i in range(0,n - j):
вот это как раз и проходит по этим диагоналям с учетом уменьшения длины.
Ну и несколько упрощая программу, получим
Программу можно еще упростить, если использовать генераторы, но мы до них не дошли.
Задача 4. Дан двумерный список (n на m), необходимо вывести его элементы по спирали.
Решение представлено ниже
Обсудим некоторые детали.
1. Главная идея. Двигаемся по матрица как сказано по условию. Пройдя строку или столбец убираем его. Убираем, конечно виртуально, меняя размерность матрицы.
2. Для чего нужен внешний цикл? Чтобы повторять и повторять процесс движения по матрице с новыми размерностями. При этом после каждого внутреннего цикла проверка: не совпали первая строка с последней или первый столбец с последним. Если совпали, то выход из внешнего цикла.
3. Критерий выхода может быть и другим. Например, сколько шагов сделал программа. Естественно мы знаем, что шагов должно быть n*m.
Всего наилучшего. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.
#программирование #программисты #языки программирования #python