Помогите с объяснением задачи "Диагонали, параллельные главной"
Задача "Диагонали, параллельные главной"
Объясните пожалуйста решение как можно более подробно.
Заранее спасибо)
Условие:
Дано число n. Создайте массив размером n×n и заполните его по следующему правилу. На главной диагонали должны быть записаны числа 0. На двух диагоналях, прилегающих к главной, числа 1. На следующих двух диагоналях числа 2, и т.д.
Решение:
n = int(input())
a = [[abs(i - j) for j in range(n)] for i in range(n)]
for row in a:
print(' '.join([str(i) for i in row]))
Ответы (1 шт):
получить от пользователя размер
n, посколькуinput()всегда возвращает строку, то перевести результат в целое числоn = int(input())сформировать матрицу (список списка) с требуемыми условиями:
a = [[abs(i - j) for j in range(n)] for i in range(n)]
для этого используется конструкция питона вида
array = [element for object in list]
в данном случае формируется список, где для каждой 'i' строки в качестве каждого элемента выступает список:
a = [[...] for i in range(n)]
а этот самый подсписок (список внутри списка) формируется так, что для каждого столбца 'j' в качестве элемента выступает число
[abs(i - j) for j in range(n)]
где abs(i - j) показывает расстояние от главной диагонали
вывести матрицу на экран можно построчно:
for row in a: print(' '.join([str(i) for i in row]))
где строка формируется склеиванием значений через разделитель пробел с помощью метода join:
' '.join([str(i) for i in row])
поскольку join умеет соединять только список строк, то числа из строки переводятся в строки str(i)
как вариант вместо
print(' '.join([str(i) for i in row]))
можно было бы сделать
print(' '.join(str(i) for i in row))
т.е. в данном случае скобки [] не обязательны
или даже сделать так:
print(' '.join(map(str, row)))
что даже компактнее :)
но наиболее компактно и ясно вывод строки лучше сделать так:
print(*row, sep=' ')