Проверьте является ли двумерный массив симметричным относительно главной диагонали питон

Двумерные массивы

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

Здесь первая строка списка A[0] является списком из чисел [1, 2, 3] . То есть A[0][0] == 1 , значение A[0][1] == 2 , A[0][2] == 3 , A[1][0] == 4 , A[1][1] == 5 , A[1][2] == 6 .

Для обработки и вывода списка как правило используется два вложенных цикла. Первый цикл по номеру строки, второй цикл по элементам внутри строки. Например, вывести двумерный числовой список на экран построчно, разделяя числа пробелами внутри одной строки, можно так:

for i in range(len(A)): for j in range(len(A[i]): print(A[i][j], end = ' ') print()

То же самое, но циклы не по индексу, а по значениям списка:

for row in A: for elem in row: print(elem, end = ' ') print()

Естественно для вывода одной строки можно воспользоваться методом join :

for row in A: print(' '.join(list(map(str, row))))

Используем два вложенных цикла для подсчета суммы всех чисел в списке:

S = 0 for i in range(len(A)): for j in range(len(A[i])): S += A[i][j]

Или то же самое с циклом не по индексу, а по значениям строк:

S = 0 for row in A: for elem in row: S += elem

Создание списка

Пусть даны два числа: количество строк n и количество столбцов m . Необходимо создать список размером n × m , заполненный нулями.

Очевидное решение оказывается неверным:

В этом легко убедиться, если присвоить элементу A[0][0] значение 1 , а потом вывести значение другого элемента A[1][0] — оно тоже будет равно 1! Дело в том, что [0] * m возвращает ccылку на список из m нулей. Но последующее повторение этого элемента создает список из n элементов, которые являются ссылкой на один и тот же список (точно так же, как выполнение операции B = A для списков не создает новый список), поэтому все строки результирующего списка на самом деле являются одной и той же строкой.

Читайте также:  Java initialise array list

Таким образом, двумерный список нельзя создавать при помощи операции повторения одной строки. Что же делать?

Первый способ: сначала создадим список из n элементов (для начала просто из n нулей). Затем сделаем каждый элемент списка ссылкой на другой одномерный список из m элементов:

A = [0] * n for i in range(n): A[i] = [0] * m

Другой (но похожий) способ: создать пустой список, потом n раз добавить в него новый элемент, являющийся списком-строкой:

A = [] for i in range(n): A.append([0] * m)

Ввод списка

Пусть программа получает на вход двумерный массив, в виде n строк, каждая из которых содержит m чисел, разделенных пробелами. Как их считать? Например, так:

A = [] for i in range(n): A.append(list(map(int, input().split())))

Или, без использования сложных вложенных вызовов функций:

A = [] for i in range(n): row = input().split() for i in range(len(row)): row[i] = int(row[i]) A.append(row)

Сложный пример обработки массива

Пусть дан квадратный массив из n строк и n столбцов. Необходимо элементам, находящимся на главной диагонали, проходящей из левого верхнего угла в правый нижний (то есть тем элементам A[i][j] , для которых i==j ) присвоить значение 1 , элементам, находящимся выше главной диагонали – значение 0, элементам, находящимся ниже главной диагонали – значение 2. То есть получить такой массив (пример для n==4 ):

1 0 0 0 2 1 0 0 2 2 1 0 2 2 2 1

Рассмотрим несколько способов решения этой задачи. Элементы, которые лежат выше главной диагонали – это элементы A[i][j] , для которых ij . Таким образом, мы можем сравнивать значения i и j и по ним определять значение A[i][j] . Получаем следующий алгоритм:

for i in range(n): for j in range(n): if i < j: A[i][j] = 0 elif i >j: A[i][j] = 2 else: A[i][j] = 1

Данный алгоритм плох, поскольку выполняет одну или две инструкции if для обработки каждого элемента. Если мы усложним алгоритм, то мы сможем обойтись вообще без условных инструкций.

Читайте также:  Ввод массива питон рандомное

Сначала заполним главную диагональ, для чего нам понадобится один цикл:

Затем заполним значением 0 все элементы выше главной диагонали, для чего нам понадобится в каждой из строк с номером i присвоить значение элементам A[i][j] для j = i+1 , . n-1 . Здесь нам понадобятся вложенные циклы:

for i in range(n): for j in range(i + 1, n): A[i][j] = 0

Аналогично присваиваем значение 2 элементам A[i][j] для j = 0 , . i-1 :

for i in range(n): for j in range(0, i): A[i][j] = 2

Можно также внешние циклы объединить в один и получить еще одно, более компактное решение:

for i in range(n): for j in range(0, i): A[i][j] = 2 A[i][i] = 1 for j in range(i + 1, n): A[i][j] = 0

А вот такое решение использует операцию повторения списков для построения очередной строки списка. i -я строка списка состоит из i чисел 2 , затем идет одно число 1 , затем идет n-i-1 число 0 :

for i in range(n): A[i] = [2] * i + [1] + [0] * (n - i - 1)

Упражнения

A: Максимум

Найдите индексы первого вхождения максимального элемента. Выведите два числа: номер строки и номер столбца, в которых стоит наибольший элемент в двумерном массиве. Если таких элементов несколько, то выводится тот, у которого меньше номер строки, а если номера строк равны то тот, у которого меньше номер столбца.

Источник

Симметрична ли матрица

Проверьте, является ли двумерный массив симметричным относительно главной диагонали. Главная диагональ — та, которая идёт из левого верхнего угла двумерного массива в правый нижний.

Выходные данные
Программа должна выводить слово yes для симметричного массива и слово no для несимметричного.
Для примера:

Ввод
3
0 1 2
1 5 3
2 3 4
Result
yes

Ввод
3
0 0 0
0 0 0
1 0 0
Result
no

симметрична ли матрица
Проверьте, является ли двумерный массив симметричным относительно главной диагонали. Главная.

Симметрична ли матрица относительно ее вертикали?
Дана квадратная матрица порядка n.n-парное.Является ли она симметрична относительно ее.

Читайте также:  font-style

Симметрична ли матрица по главной диагонали
using namespace std; int reverse_number(int number) < int n = 0; while(number) .

Определить, симметрична ли заданная матрица
Помогите написать код для задачи Задана матрица размером NxM. Получить массив B, присвоив его k-му.

Эксперт Python

eaa, 80 тем, 4 поста. Статистика показывает, что ответа ты не дождешься..

iSmokeJC, да я и не ждал))

Симметрична ли матрица относительно главной диагонали
если n меньше либо равно нулю выдавать ошибку,если матрица симметрична выдать сообщение матрица.

Проверить, матрица А (7,7) симметрична относительно главной диагонали
Проверить, матрица А (7,7) симметрична относительно главной диагонали.

Проверить симметрична ли матрица 5*5 относительно главной диагонали
(проверить симметрична ли матрица 5*5 относительно главной диагонали. Ребят помогите пожалуйста.

Симметрична ли квадратная матрица относительно вспомогательной диагонали
Проверить, или данная квадратная матрица симметрична относительно вспомогательной (укр. допоміжної).

Проверить симметрична ли матрица А относительно побочной диагонали
Задано квадратную матрицу A . Проверить матрица А симметрична относительно побочной.

Определить, симметрична ли матрица относительно главной диагонали
Дана целочисленная квадратная матрица. Определить, симметрична ли матрица относительно главной.

Источник

Оцените статью