Lección Python

Contenido de la lección

Introducción

Contenido de la lección.

Objetivos de aprendizaje
  • Objetivo 1
  • Objetivo 2
  • Objetivo 3

Objetivos de Aprendizaje

Al finalizar este tema, serás capaz de:
  • Comprender la estructura y funcionamiento de listas anidadas en Python
  • Implementar matrices bidimensionales y multidimensionales para resolver problemas de ingeniería
  • Dominar técnicas de navegación, acceso y manipulación de datos en estructuras complejas
  • Aplicar listas anidadas en casos de uso reales como procesamiento de imágenes y análisis de datos

📚 Conceptos Fundamentales de Listas Anidadas

Una lista anidada es una estructura de datos que contiene otras listas como elementos. Cada elemento de la lista principal puede ser a su vez una lista, creando una estructura jerárquica o multidimensional. En Python, no existe un tipo de dato específico para matrices como en otros lenguajes, pero las listas anidadas proporcionan esta funcionalidad de manera natural y flexible. La sintaxis básica consiste en colocar listas dentro de corchetes, separadas por comas. El acceso a elementos se realiza mediante índices múltiples, donde el primer índice selecciona la fila y el segundo la columna en el caso de matrices bidimensionales. Esta estructura permite representar tablas, matrices matemáticas, grids de juegos, datos de sensores organizados por tiempo y ubicación, entre muchas otras aplicaciones en ingeniería.

Creación básica de una lista anidada (matriz 3x3) Copiar
# Creando una matriz 3x3
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print('Matriz completa:')
print(matriz)
print('\nAcceso a elemento [1][2]:')
print(matriz[1][2])
print('\nPrimera fila:')
print(matriz[0])
Matriz completa:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Acceso a elemento [1][2]:
6

Primera fila:
[1, 2, 3]
Explicación: Se crea una matriz 3x3 donde cada sublista representa una fila. El acceso se realiza con dos índices: fila y columna.

🎯 Navegación y Acceso a Elementos

La navegación en listas anidadas requiere comprender el sistema de indexación multidimensional. Para matrices bidimensionales, utilizamos la notación [fila][columna], donde ambos índices comienzan en 0. Es posible acceder a filas completas usando un solo índice, o a elementos específicos usando múltiples índices. Los índices negativos también funcionan, permitiendo acceder desde el final de cada dimensión. Para estructuras más complejas de tres o más dimensiones, simplemente agregamos más corchetes. Es importante tener en cuenta que Python no valida automáticamente que todas las filas tengan la misma longitud, por lo que podemos crear matrices irregulares. La navegación eficiente incluye técnicas como el uso de bucles anidados para recorrer todos los elementos, comprensiones de listas para transformaciones rápidas, y métodos de slicing para extraer subconjuntos de datos.

Navegación completa con bucles anidados y slicing Copiar
# Matriz irregular para demostrar navegación
datos = [[1, 2], [3, 4, 5, 6], [7, 8, 9]]

print('Navegación con bucles anidados:')
for i in range(len(datos)):
    for j in range(len(datos[i])):
        print(f'Posicion [{i}][{j}] = {datos[i][j]}')

print('\nSlicing - primeras dos filas:')
print(datos[:2])
print('\nÚltimos dos elementos de la segunda fila:')
print(datos[1][-2:])
Navegación con bucles anidados:
Posicion [0][0] = 1
Posicion [0][1] = 2
Posicion [1][0] = 3
Posicion [1][1] = 4
Posicion [1][2] = 5
Posicion [1][3] = 6
Posicion [2][0] = 7
Posicion [2][1] = 8
Posicion [2][2] = 9

Slicing - primeras dos filas:
[[1, 2], [3, 4, 5, 6]]

Últimos dos elementos de la segunda fila:
[5, 6]
Explicación: Los bucles anidados permiten recorrer matrices irregulares de forma segura. El slicing funciona en cada dimensión independientemente.

💡 Manipulación y Modificación de Estructuras

La manipulación de listas anidadas incluye operaciones como agregar, eliminar y modificar elementos en cualquier nivel de la estructura. Para modificar elementos individuales, simplemente asignamos un nuevo valor usando la indexación múltiple. Podemos agregar filas completas usando append() o insert(), y agregar elementos a filas específicas accediendo primero a la sublista correspondiente. La eliminación se puede realizar con del, pop() o remove(), dependiendo de si queremos eliminar por índice o por valor. Para operaciones masivas, las comprensiones de listas anidadas son extremadamente útiles, permitiendo transformar o filtrar datos de manera concisa. También es posible crear copias profundas para evitar referencias compartidas entre estructuras, lo cual es crucial cuando trabajamos con múltiples matrices que pueden modificarse independientemente.

Modificación y manipulación avanzada de matrices Copiar
# Creación y manipulación de matriz
matriz = [[1, 2], [3, 4]]
print('Matriz original:')
print(matriz)

# Modificar elemento específico
matriz[0][1] = 10
print('\nDespués de modificar [0][1] = 10:')
print(matriz)

# Agregar nueva fila
matriz.append([5, 6])
print('\nDespués de agregar fila [5, 6]:')
print(matriz)

# Comprensión anidada para duplicar valores
matriz_doble = [[x * 2 for x in fila] for fila in matriz]
print('\nMatriz con valores duplicados:')
print(matriz_doble)
Matriz original:
[[1, 2], [3, 4]]

Después de modificar [0][1] = 10:
[[1, 10], [3, 4]]

Después de agregar fila [5, 6]:
[[1, 10], [3, 4], [5, 6]]

Matriz con valores duplicados:
[[2, 20], [6, 8], [10, 12]]
Explicación: La modificación directa cambia el elemento en su posición. Las comprensiones anidadas crean nuevas estructuras transformadas sin modificar la original.

🔧 Casos de Uso Avanzados y Aplicaciones Profesionales

En aplicaciones profesionales de ingeniería, las listas anidadas tienen múltiples usos prácticos. En procesamiento de imágenes, una imagen puede representarse como una matriz bidimensional donde cada elemento es un valor de pixel. Para imágenes a color, se utiliza una estructura tridimensional [alto][ancho][RGB]. En análisis de datos de sensores, podemos organizar lecturas por tiempo y ubicación usando matrices multidimensionales. Los algoritmos de pathfinding en robótica utilizan matrices para representar mapas y obstáculos. En simulaciones numéricas, las matrices representan sistemas de ecuaciones lineales o grids de cálculo. Para bases de datos simples, las listas anidadas pueden simular tablas relacionales. La clave del uso profesional está en elegir la estructura adecuada para el problema específico, considerando eficiencia de acceso, uso de memoria y facilidad de mantenimiento del código.

Simulación de procesamiento de imagen (escala de grises) Copiar
# Simulación de imagen 4x4 en escala de grises (0-255)
imagen = [
    [0, 50, 100, 150],
    [25, 75, 125, 175],
    [50, 100, 150, 200],
    [75, 125, 175, 255]
]

print('Imagen original:')
for fila in imagen:
    print(fila)

# Aplicar filtro de brillo (+30)
print('\nImagen con brillo aumentado:')
imagen_brillante = []
for fila in imagen:
    nueva_fila = []
    for pixel in fila:
        nuevo_pixel = min(255, pixel + 30)  # Limitar a 255
        nueva_fila.append(nuevo_pixel)
    imagen_brillante.append(nueva_fila)

for fila in imagen_brillante:
    print(fila)
Imagen original:
[0, 50, 100, 150]
[25, 75, 125, 175]
[50, 100, 150, 200]
[75, 125, 175, 255]

Imagen con brillo aumentado:
[30, 80, 130, 180]
[55, 105, 155, 205]
[80, 130, 180, 230]
[105, 155, 205, 255]
Explicación: Esta simulación muestra cómo procesar imágenes píxel por píxel, aplicando transformaciones como ajuste de brillo con validación de límites.
Sistema de gestión de datos de sensores IoT Copiar
# Datos de sensores: [día][hora][sensor_id] = lectura
sensores_data = [
    # Día 1: temperatura, humedad, presión por hora
    [[22.5, 65, 1013], [23.1, 62, 1014], [24.0, 58, 1015]],
    # Día 2
    [[21.8, 70, 1012], [22.3, 68, 1013], [23.5, 64, 1014]]
]

# Función para obtener promedio de temperatura
def promedio_temperatura():
    total_temp = 0
    count = 0
    for dia in sensores_data:
        for hora in dia:
            total_temp += hora[0]  # Índice 0 = temperatura
            count += 1
    return total_temp / count

print(f'Temperatura promedio: {promedio_temperatura():.1f}°C')
print(f'Lectura día 2, hora 3, humedad: {sensores_data[1][2][1]}%')
Temperatura promedio: 22.9°C
Lectura día 2, hora 3, humedad: 64%
Explicación: Estructura tridimensional para organizar datos de múltiples sensores a lo largo del tiempo, facilitando análisis estadísticos y consultas específicas.

Ejercicios Prácticos

Calculadora de Matrices
INTERMEDIO

Descripción:

Implementa funciones para sumar y multiplicar dos matrices bidimensionales. Las funciones deben validar que las matrices tengan dimensiones compatibles y manejar errores apropiadamente.

Pista: Para la suma, ambas matrices deben tener las mismas dimensiones. Para la multiplicación, el número de columnas de la primera debe igual al número de filas de la segunda.
Juego de Tres en Raya
BÁSICO

Descripción:

Crea un tablero de tres en raya usando una matriz 3x3. Implementa funciones para mostrar el tablero, validar movimientos, detectar ganadores y gestionar turnos de jugadores.

Pista: Usa una matriz con strings ('X', 'O', ' ') para representar el estado del tablero. Crea funciones separadas para cada funcionalidad.
Análisis de Ventas Multidimensional
AVANZADO

Descripción:

Diseña una estructura para almacenar ventas por [mes][producto][región] y crea funciones para calcular totales por mes, producto más vendido por región, y crecimiento mensual.

Pista: Utiliza una estructura tridimensional con índices bien definidos. Implementa funciones auxiliares para navegación y cálculos estadísticos.
Procesador de Imágenes Básico
AVANZADO

Descripción:

Simula una imagen como matriz de valores RGB (estructura 3D) e implementa filtros básicos: escala de grises, inversión de colores, y rotación 90 grados.

Pista: Para escala de grises usa la fórmula: 0.299*R + 0.587*G + 0.114*B. Para rotación, transpone la matriz y luego invierte filas o columnas.

Resumen y Próximos Pasos

Las listas anidadas y estructuras multidimensionales son herramientas poderosas que abren las puertas a la manipulación avanzada de datos en Python. Hemos explorado desde conceptos básicos hasta aplicaciones profesionales en procesamiento de imágenes y análisis de datos de sensores. El dominio de estas estructuras es fundamental para el siguiente tema donde abordaremos algoritmos de ordenamiento y búsqueda en estructuras complejas, así como optimización de rendimiento en operaciones con grandes volúmenes de datos. La práctica constante con ejercicios reales consolidará estos conocimientos y preparará el camino hacia técnicas más avanzadas de programación en ingeniería.

🏷️ Etiquetas:
python listas-anidadas matrices estructuras-datos programación ingeniería