Construir estructuras de datos más complejas a partir de otras más simples es una de las habilidades fundamentales en programación. Aquí se explica paso a paso cómo crear un array bidimensional reutilizando una clase array previamente desarrollada, aplicando conceptos como anidación de objetos, loops anidados y representación en string.
¿Qué es un array de dos dimensiones y por qué se le llama grid?
Un array de dos dimensiones es una estructura de datos que organiza elementos en filas y columnas, formando una tabla. También se le conoce como bidimensional array, two dimensional array, grid, rejilla, malla o tabla [0:29]. Todos estos nombres hacen referencia a lo mismo: una estructura donde la intersección de cada fila con cada columna contiene un elemento con un valor propio.
Si alguna vez anidaste una lista dentro de otra lista en Python, ya trabajaste con esta idea. La diferencia es que ahora se construye de forma más robusta usando una clase dedicada.
¿Cómo se construye la clase grid en Python?
El archivo se llama grid.py y lo primero que se hace es importar la clase array desarrollada previamente [1:17]:
python
from array import Array
class Grid:
def init(self, rows, columns, fill_value=None):
self.data = Array(rows)
for row in range(rows):
self.data[row] = Array(columns, fill_value)
El método constructor __init__ recibe tres parámetros: filas, columnas y un valor por defecto (fill_value). Internamente se crea un array cuya longitud es el número de filas, y en cada posición se anida otro array con el tamaño de las columnas [1:35]. Esta técnica de anidar un array dentro de otro es la base de la bidimensionalidad.
¿Cómo obtener la altura y el ancho del grid?
A diferencia de un array unidimensional que solo tiene longitud, un grid posee altura y ancho [2:15]:
python
def get_height(self):
return len(self.data)
def get_width(self):
return len(self.data[0])
get_height retorna la cantidad de filas usando len(self.data).
get_width retorna la cantidad de columnas consultando len(self.data[0]), porque las columnas están anidadas en la posición cero del array principal [2:40].
¿Cómo acceder a elementos y representarlos como string?
El método __getitem__ permite recuperar un elemento por su índice [2:55]:
python
def getitem(self, index):
return self.data[index]
Para la representación en string se utilizan ciclos for anidados que recorren filas y columnas [3:15]:
python
def str(self):
result = ""
for row in range(self.get_height()):
for col in range(self.get_width()):
result += str(self.data[row][col]) + " "
result += "\n"
return str(result)
El backslash n (\n) genera un salto de línea entre filas para mejorar la legibilidad. Sin ese espacio adicional después de cada dato, todos los valores aparecerían pegados [4:25].
¿Cómo se prueba el grid en la terminal?
Se crea una instancia llamada matrix de tres filas por tres columnas [5:00]:
python
from grid import Grid
matrix = Grid(3, 3)
print(matrix)
Inicialmente todos los valores son None. Para asignar valores distintos se recorren filas y columnas con loops anidados [5:55]:
python
for row in range(matrix.get_height()):
for col in range(matrix.get_width()):
matrix[row][col] = row * col
Al imprimir se obtiene una tabla legible con los resultados de multiplicar cada índice de fila por el de columna. Los métodos get_height y get_width confirman que ambas dimensiones son tres [6:20]. Para acceder a un dato específico se indica primero la fila y luego la columna: matrix[2][0] devuelve cero [6:45].
¿Qué ocurre con los arrays de tres dimensiones?
Un array tridimensional es simplemente un array dentro de otro array que a su vez está dentro de otro [8:05]. Aunque es posible implementarlo, se recomienda mantenerse en dos niveles de anidación para no aumentar la complejidad del código innecesariamente.
La gran ventaja de este enfoque es que no fue necesario reescribir todo desde cero: se reutilizó la clase array original y se le incorporaron métodos nuevos como get_height, get_width y la representación en string adaptada a dos dimensiones. Dominar los loops anidados resulta indispensable para recorrer estas estructuras correctamente [8:25].
Si quieres llevar esto al siguiente nivel, intenta crear una clase llamada cube con tres dimensiones e incluir métodos para conocer largo, ancho y profundidad. Comparte tu solución y cuéntanos qué métodos adicionales le añadiste.