печать диагоналей из матрицы

#python #python-3.x

#python #python-3.x

Вопрос:

это матрица, из которой мне нужно распечатать диагонали:

 1 2 3
4 5 6
7 8 9
 

мне нужно напечатать 1, 5, 9 и 3, 5, 7 (отдельно)

он также должен запрашивать ввод данных пользователем для измерений

это то, что я пытался сделать:

 n = int(input("enter dimension: "))
lst=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

print(lst)

for i in range(0, n):
    for j in range(0, n):
        if i == j:
            print(lst[i][j])

for i in range(0, n):
    for j in range(n-1, 0, -1):
        print(lst[i][j])
 

это работает наполовину, потому что я получаю 1, 5 и 9, но не 3, 5 и 7.

Комментарии:

1. Подумайте о условии, которому должны соответствовать координаты, чтобы быть на второй диагонали. Запишите несколько координат и подумайте, как связаны i, j и n.

2. Еще одно соображение: для матрицы n by n диагональ состоит только из n элементов. Это следует рассматривать как намек на то, что вы можете решить эту проблему только n с помощью операций, что означает один for цикл, вместо n^2 операций, которые вы выполняете в данный момент. Подумайте: нужно ли вам перебирать возможное значение i и j отдельно, или вы можете вывести одно из другого?

Ответ №1:

Привет, вы можете сделать это для вторичной диагонали: (автор Мохит Кумар)

 # Function to print the Secondary Diagonal
def printSecondaryDiagonal(mat, n):
    print("Secondary Diagonal: ", end = "")
 
    for i in range(n):
        for j in range(n):
 
            # Condition for secondary diagonal
            if ((i   j) == (n - 1)):
                print(mat[i][j], end = ", ")
    print()
 
# Driver code
n = 4
a = [[ 1, 2, 3, 4 ],
     [ 5, 6, 7, 8 ],
     [ 1, 2, 3, 4 ],
     [ 5, 6, 7, 8 ]]

printSecondaryDiagonal(a, n)
 

Ответ №2:

Вы могли бы использовать list comprehensions , чтобы получить 2 диагонали как —

  1. Как указывалось, поскольку matrix is mxm , вы можете просто выполнить итерацию по диагонали, выполнив итерацию по диапазону индексов один раз, как в этом случае (0,0), (1,1), (2,2)
  2. Для второй требуемой диагонали вы можете просто reverse указать диапазон индексов и вместе с enumerate ними получить диагональные элементы, как в этом случае (0,2), (1,1), (2,0)

Оба вышеуказанных метода требуют n только итераций порядка (где n — длина диагонали).

 a = [[1, 2, 3], 
     [4, 5, 6],
     [7, 8, 9]]

d1 = [a[i][i] for i in range(len(a))]
d2 = [a[i][j] for i,j in enumerate(reversed(range(len(a))))]

print(d1)
print(d2)
 
 [1 5 9]
[3 5 7]
 

Если вам нужно распечатать оба из них вместе, вы можете просто сделать это с помощью одной итерации по матрице (порядок n ) —

 d1 = []
d2 = []

for i,j in enumerate(reversed(range(len(a)))):
    d1.append(a[i][i])
    d2.append(a[i][j])
    
print(d1)
print(d2)
 
 [1 5 9]
[3 5 7]
 

Однако, если вы открыты для использования NumPy , вы можете сделать это довольно легко, используя np.diag as —

 import numpy as np

d1 = np.array(a).diagonal()
d2 = np.fliplr(a).diagonal()

print(d1)
print(d2)
 
 [1 5 9]
[3 5 7]
 

Ответ №3:

 lst=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

diag1 = []
diag2 = []

for col, row in enumerate(lst):
    diag1.append(row[col])
    diag2.append(row[-col-1])
    
print(diag1)
print(diag2)
 

Вывод:

 [1, 5, 9]
[3, 5, 7]
 

Объяснение:

enumerate() Функция создаст из вашего списка что-то в виде списка пар:

 [(0, [1, 2, 3]),
 (1, [4, 5, 6]),
 (2, [7, 8, 9])]
 

Первый элемент пары — это просто индекс элемента, который вы хотите выбрать (я присвоил его переменной col ):

  • элемент с индексом 0 из строки [1, 2, 3] , т.Е. элемент 1 ,
  • элемент с индексом 1 из строки [4, 5, 6] , т.Е. элемент 5 ,
  • элемент с индексом 2 из строки [7, 8, 9] , т. Е. Элемент 9 .

Для второй диагонали вы хотите выбрать элементы, считая с конца. Для индексации с конца используются отрицательные числа ( -1 является последним элементом, -2 является предпоследним и т. Д.), Т. Е. Вы хотите выбрать:

  • элемент с индексом -1 из строки [1, 2, 3] , т.Е. элемент 3 ,
  • элемент с индексом -2 из строки [4, 5, 6] , т.Е. элемент 5 ,
  • элемент с индексом -3 из строки [7, 8, 9] , т. Е. Элемент 7 .

Чтобы получить эти индексы из исходных индексов 0, 1 и 2 (последовательно присваиваемых переменной col в for цикле), я использовал выражение -col-1 :

 | col | (-col-1) |result|
|----- ---------- ------|
|  0  |  -0 - 1  |  -1  |
|  1  |  -1 - 1  |  -2  |
|  2  |  -2 - 1  |  -3  |