Con una cuenta desbloqueas el cuestionario, el foro de dudas y el tutor con IA de esta lección, además del registro de progreso y el certificado verificable al terminar «Python para Ingeniería Espacial».
Imagina que quieres guardar el catálogo de satélites que tu estación puede seguir. Con lo aprendido hasta ahora escribirías sat1_nombre, sat1_frecuencia, sat2_nombre, sat2_frecuencia... y a los siete satélites tendrías catorce variables y ninguna forma de recorrerlas con un bucle. El diseño no falla por feo: falla porque el número de datos es dato del problema, no del programa. Mañana entran tres satélites nuevos y habría que reescribir el código.
Las colecciones resuelven eso: estructuras que guardan muchos valores bajo un solo nombre y que un bucle puede recorrer sin saber cuántos hay.
Listas: valores en orden
Una lista es una secuencia ordenada de valores, escrita entre corchetes y separada por comas. Guarda el orden, admite repetidos y puede crecer.
Se accede por índice, y aquí llega la convención que más confunde al principio: el primer elemento es el índice 0. En una lista de cuatro elementos los índices válidos son 0, 1, 2 y 3; pedir el 4 produce IndexError: list index out of range. A cambio, Python regala los índices negativos, que cuentan desde el final: -1 es el último, -2 el penúltimo. Es enormemente cómodo y no existe en la mayoría de lenguajes.
Expresión
Resultado
Lectura
frecuencias_mhz[0]
137.100
Primero
frecuencias_mhz[3]
437.025
Cuarto
frecuencias_mhz[-1]
437.025
Último, sin saber cuántos hay
frecuencias_mhz[1:3]
[137.9125, 145.8]
Rebanada: desde el 1 hasta antes del 3
frecuencias_mhz[:2]
[137.1, 137.9125]
Los dos primeros
frecuencias_mhz[2:]
[145.8, 437.025]
Desde el tercero hasta el final
len(frecuencias_mhz)
4
Cuántos elementos hay
El slicing (rebanado) sigue la misma regla que range: el extremo izquierdo se incluye y el derecho no. Puede parecer arbitrario, pero tiene una propiedad muy útil: lista[:k] y lista[k:] parten la lista en dos trozos sin solaparse ni perder nada, para cualquier k.
Para hacer crecer una lista se usa .append(valor), que añade al final. Ojo con un detalle que sorprende: .append()modifica la lista en el sitio y devuelve None. Escribir frecuencias = frecuencias.append(1694.1) destruye tu lista y la deja en None. Se llama sin asignar nada.
Playground · python
Diccionarios: valores con nombre
Una lista responde a "el elemento número 2". Un diccionario responde a "el elemento llamado banda". Se escribe entre llaves, con pares clave: valor:
La ventaja sobre la lista es de legibilidad y robustez: satelite["frecuencia_mhz"] se entiende sin contexto, mientras que satelite[2] obliga a recordar en qué posición pusiste la frecuencia — y a reescribir medio programa el día que insertes un campo nuevo en medio.
Operaciones esenciales:
Operación
Qué hace
d["clave"]
Lee el valor; si la clave no existe, KeyError
d.get("clave", 0)
Lee el valor, o devuelve 0 si la clave no existe
d["nueva"] = v
Crea la clave si no existía, o sobrescribe si existía
"clave" in d
Devuelve True o False según exista la clave
len(d)
Cuántos pares hay
d.keys() / d.values() / d.items()
Claves, valores o pares para recorrer
El operador in sobre un diccionario mira las claves, no los valores, y es la forma correcta de protegerse antes de leer un campo opcional. Para recorrer clave y valor a la vez se usa .items(), que entrega ambos en cada vuelta.
El catálogo: lista de diccionarios
La combinación de las dos estructuras es el formato de datos más frecuente de toda la programación aplicada: una lista donde cada elemento es un diccionario con los mismos campos. Es, esencialmente, una tabla — filas y columnas — y es exactamente la forma en la que llegan los datos de una API o de un archivo JSON.
Nombre
Banda
Frecuencia (MHz)
NOAA-19
VHF
137.100
NOAA-18
VHF
137.9125
METEOR-M2-4
VHF
137.900
ISS (ZARYA)
VHF
145.800
AO-73
VHF
145.935
CUBESAT-UHF
UHF
437.025
GOES-16 HRIT
L
1694.100
Ejemplo resuelto: filtrar y buscar el máximo
Dos preguntas que un operador hace todos los días, resueltas a mano antes de escribirlas en código.
¿Cuántos satélites emiten en VHF? Recorremos la tabla comparando el campo banda con "VHF": aciertan NOAA-19, NOAA-18, METEOR-M2-4, ISS y AO-73. Son 5 de 7, es decir el 71.4% del catálogo. Tiene sentido: la banda de 137 MHz es la que usan los meteorológicos de órbita polar con APT, y 145 MHz es la subbanda satelital de radioaficionado.
¿Cuál emite en la frecuencia más alta? El patrón para buscar un máximo es siempre el mismo y conviene grabarlo: se supone que el primero es el campeón y se recorre el resto retándolo. Empezamos con NOAA-19 a 137.100; NOAA-18 a 137.9125 gana; METEOR-M2-4 a 137.900 no; ISS a 145.800 gana; AO-73 a 145.935 gana; CUBESAT-UHF a 437.025 gana; GOES-16 HRIT a 1694.100 gana. Campeón final: GOES-16 HRIT, con una frecuencia 1694.100/137.100≈12.4 veces mayor que la más baja del catálogo. Ese salto es justo la razón por la que GOES necesita una antena y una cadena de recepción completamente distintas.
Playground · python
Iterar sobre dos cosas a la vez
Dos utilidades cierran el repertorio básico de recorrido, y ambas ahorran manejar índices a mano —que es donde se cuelan los errores de uno:
enumerate(lista) entrega en cada vuelta la posición y el elemento. Sirve para numerar filas de un informe sin llevar un contador manual.
zip(a, b) recorre dos listas en paralelo y se detiene con la más corta. Sirve para cruzar, por ejemplo, la lista de instantes con la de elevaciones medidas.
nombres = ["NOAA-19", "METEOR-M2-4", "ISS (ZARYA)"]
elevaciones = [47.3, 12.0, 61.5]
for i, nombre in enumerate(nombres):
print(i, nombre)
for nombre, elev in zip(nombres, elevaciones):
print(f"{nombre:14s} elevación máxima {elev:.1f} grados")
Un último aviso que conviene oír pronto: una lista es mutable y su nombre es solo una etiqueta. Si haces copia = catalogo no obtienes una copia sino un segundo nombre para la misma lista, y modificar copia modifica catalogo. Para copiar de verdad hay que pedirlo explícitamente (copia = catalogo[:] o copia = list(catalogo)). Este comportamiento es fuente de bugs desconcertantes y lo trataremos con calma cuando lleguemos a funciones.
1 de 8
Comprueba la convención que más despistes causa:
Sobre la lista frecuencias = [137.1, 137.9125, 145.8, 437.025], ¿qué devuelve frecuencias[1:3]?
Con listas, diccionarios, bucles y condicionales ya tienes el vocabulario completo de un programa útil. Lo que falta es organizarlo para que no se convierta en un muro de doscientas líneas: funciones, módulos y archivos. Ahí empieza el segundo bloque del curso.