Помогите с объяснением задачи "Диагонали, параллельные главной"

Задача "Диагонали, параллельные главной"

Объясните пожалуйста решение как можно более подробно.
Заранее спасибо)

Условие:

Дано число 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 шт):

Автор решения: Zhihar
  1. получить от пользователя размер n, поскольку input() всегда возвращает строку, то перевести результат в целое число

     n = int(input())
    
  2. сформировать матрицу (список списка) с требуемыми условиями:

     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) показывает расстояние от главной диагонали

  1. вывести матрицу на экран можно построчно:

     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=' ')
→ Ссылка