#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
byn
диагональ состоит только из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 диагонали как —
- Как указывалось, поскольку matrix is
mxm
, вы можете просто выполнить итерацию по диагонали, выполнив итерацию по диапазону индексов один раз, как в этом случае(0,0), (1,1), (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 |