Saltar al contenido
src / articulos / 04-listas_y_diccionarios.md

Listas y Diccionarios en Python

Emilio Castro //

La orquestación de la infraestructura moderna no trata sobre administrar un solo servidor, sino conjuntos masivos de recursos y configuraciones. Para representar esta multiplicidad en el código, Python proporciona dos potentes estructuras de datos base: Listas y Diccionarios.

La versatilidad de ambas, combinada con su tipado dinámico, elimina la necesidad de predefinir el tamaño de las colecciones, una ventaja fundamental sobre arreglos estáticos en otros lenguajes.

Las Listas: Colecciones Ordenadas

Las listas son colecciones ordenadas e iterables cuyos elementos se acceden mediante su índice posicional numérico (comenzando en 0). Aceptan elementos de cualquier tipo.

# Definir una lista de zonas de disponibilidad en AWS
az_list = ['us-east-1a', 'us-east-1b', 'us-east-1c', 'us-west-2a']

# Iterar sobre la lista de zonas para un despliegue
print('=== Iterando zonas para el despliegue ===')
for az in az_list:
    print(f'Aprovisionando recurso en: {az}')

# Acceder a un valor específico mediante su índice
print('=== Inspeccionando la zona primaria ===')
print(az_list[0])  # Salida: us-east-1a

# Añadir una nueva zona dinámica
az_list.append('eu-central-1a')
print(az_list)

Además, puedes aplicar funciones del ecosistema estándar. Para escenarios de balanceo de carga o selecciones aleatorias, el módulo random resulta ideal.

from random import randrange

az_list = ['us-east-1a', 'us-east-1b', 'us-east-1c']
# Calcular la longitud (len) y elegir un índice aleatorio
indice_objetivo = randrange(0, len(az_list))

print(f'Balanceador asignando tráfico inicial a: {az_list[indice_objetivo]}')

Las listas incluyen múltiples métodos para modificar la colección (puedes revisarlos usando la función dir(list)). Tres de los más usados son la ordenación (.sort()), la reversión (.reverse()) y la extracción del último elemento (.pop()).

az_list = ['us-west-1', 'eu-west-1', 'us-east-1', 'ap-northeast-1']

# Orden alfabético
az_list.sort()
print(f"Zonas ordenadas: {az_list}")

# Invertir la colección resultante
az_list.reverse()
print(f"Zonas invertidas: {az_list}")

# Eliminar y recuperar la última zona (última de la lista invertida)
zona_procesada = az_list.pop()
print(f"La zona {zona_procesada} ha sido eliminada de la cola de procesamiento.")

Diccionarios: Datos Estructurados como Clave/Valor

Mientras las listas almacenan valores individuales indexados numéricamente, los diccionarios representan objetos complejos utilizando una estructura de pares clave/valor (similar a un objeto JSON o YAML). Las claves funcionan como etiquetas semánticas y garantizan el acceso directo a una propiedad en tiempo O(1).

# Representar la configuración de un nodo de base de datos
nodo_db = {
    'hostname': 'db-cluster-01',
    'engine': 'postgres',
    'version': '15.4',
    'port': 5432,
    'backup_enabled': True,
    'max_connections': 1000
}

print('=== Metadatos del nodo ===')
print(f"Conectar mediante puerto: {nodo_db['port']}")
print(f"Motor: {nodo_db['engine']} v{nodo_db['version']}")

El poder real se manifiesta cuando combinamos ambas estructuras. Rara vez manejas un solo nodo; lo habitual es manejar listas de diccionarios (arrays de objetos).

# Un clúster representado como una lista de diccionarios
infraestructura = [
    {
        'id': 'web-01',
        'role': 'frontend',
        'status': 'running',
        'ip': '10.0.0.5'
    },
    {
        'id': 'web-02',
        'role': 'frontend',
        'status': 'draining',
        'ip': '10.0.0.6'
    },
    {
        'id': 'api-01',
        'role': 'backend',
        'status': 'running',
        'ip': '10.0.1.15'
    }
]

print('=== Reporte del Estado del Clúster ===')
# Extraer la IP del nodo api-01 accediendo al índice de lista [2] y la clave ['ip']
print(f"Dirección IP del backend maestro: {infraestructura[2]['ip']}")
print('-'*50)

# Iterar y filtrar los nodos del clúster
for nodo in infraestructura:
    print(f"Nodo: {nodo['id']:<10} | Rol: {nodo['role']:<10} | Estado: {nodo['status'].upper()}")

Esta arquitectura de datos es la base que te permitirá ingerir respuestas REST API (que retornan JSON estructurado) y analizarlas programáticamente. Dominar la extracción de valores profundos (lista[indice]['clave']) te dará el control absoluto sobre los datos de tu infraestructura.