py_spiral_matrix · Python

▶ Aprender py_spiral_matrix (Python) paso a paso · explicación de py_spiral_matrix

Código línea a línea

Tres columnas: el código, el trozo del subject o del main que obliga a escribir esa línea, y el por qué.

py_spiral_matrix.py
CódigoSubjectPor qué
def generate_spiral(n: int) -> list[list[int]]:def generate_spiral(n: int) -> list[list[int]]:Firma del subject. Devuelve lista de listas, no imprime.
if n <= 0:generates an `n x n` 2D matrixSin tamaño no hay matriz. Guard antes de reservar nada.
return []Lista vacía, no None: el tipo de retorno es lista.
grid = [[0] * n for _ in range(n)]2D matrix filled with numbers from 1 to `n^2`n filas nuevas con range. Ojo: [[0]*n]*n sería la misma fila repetida n veces.
top, bottom, left, right = 0, n - 1, 0, n - 1continuing inwardsLos cuatro bordes de la capa actual. Cada vuelta los encojo.
value = 1from 1 to `n^2`El siguiente número a colocar.
while top <= bottom and left <= right:continuing inwardsMientras quede capa: cuando los bordes se cruzan, acabé.
for col in range(left, right + 1):moving rightFila de arriba, de izquierda a derecha. right + 1 porque range excluye el final.
grid[top][col] = valueColoco y avanzo el contador.
value += 1Siguiente número.
top += 1Esa fila ya está: el borde superior baja.
for row in range(top, bottom + 1):then downColumna derecha, de arriba abajo, empezando en el nuevo top.
grid[row][right] = valueColoco y avanzo.
value += 1Siguiente número.
right -= 1Columna hecha: el borde derecho entra.
if top <= bottom:then leftGuard: si solo quedaba una fila, ya la pinté yendo a la derecha. Sin esto la repito.
for col in range(right, left - 1, -1):then leftFila de abajo al revés: paso -1 y fin left - 1 para incluir left.
grid[bottom][col] = valueColoco y avanzo.
value += 1Siguiente número.
bottom -= 1Borde inferior sube.
if left <= right:then upMismo guard para la columna: si solo quedaba una, ya está pintada.
for row in range(bottom, top - 1, -1):then upColumna izquierda de abajo arriba.
grid[row][left] = valueColoco y avanzo.
value += 1Siguiente número.
left += 1Borde izquierdo entra: la capa está cerrada.
return gridgenerate_spiral(3)[[1, 2, 3], [8, 9, 4], [7, 6, 5]].