Здравствуйте!
Недавно я наткнулся на проблему, связанную с циклическим просмотром диагоналей матрицы. Я не знал, как это сделать, поэтому я нашел ответ здесь и нашел this , где пользователь @Nemo предоставил хороший ответ, для которого другой пользователь @BioGeek предоставил реализацию, Я не совсем понимаю одну часть реализации и хотел бы помочь с ее пониманием, поскольку я новичок в программировании и не особенно опытный / опытный (ДА!) .
Реализация:
import itertools as IT
mat = [[3,3,1,1],
[2,2,1,2],
[1,1,1,2]]
""" @BioGeeks implementation """
r, c = len(mat), len(mat[0])
print([ [mat[r-1-q][p-q] for q in range(min(p, r-1), max(0, p-c+1)-1, -1)] for p in range(r+c-1)])
# [[1], [2, 1], [3, 2, 1], [3, 1, 2], [1, 2], [1]]
""" My interpretation """
diagonals = []
for p in range(r+c-1):
diag = []
for q in range(min(p, r-1), max(0, p-c+1)-1, -1):
diag.append(mat[r-1-q][p-q])
diagonals.append(diag)
print(diagonals)
# [[1], [2, 1], [3, 2, 1], [3, 1, 2], [1, 2], [1]]
Часть, которую я не до конца понимаю:
Я ищу объяснение относительно этого внутреннего l oop.
for q in range(min(p, r-1), max(0, p-c+1)-1, -1):
diag.append(mat[r-1-q][p-q])
1) Как получается, что диапазон, в котором мы l oop, составляет от min(p, r-1)
до max(0, p-c+1)-
в обратном направлении?
2) Почему "x-координата" равна [r-1-q]
, а "y-координата" равна [p-q]
?
p = номер диагонали.
q = индекс по диагонали.
r = # строк
c = # протоколы
У меня есть части, но мне трудно собрать их вместе, чтобы собрать весь кадр.