11 · Listas: la secuencia más usada
Indexación, slicing, la API completa de mutación y la sutil trampa de referencia vs copia que atrapa a todo programador Python nuevo.
Una lista de Python es una secuencia **ordenada y mutable** — puede contener cualquier mezcla de tipos y crecer o reducirse en tiempo de ejecución.
Sin esto:
Sin listas no puedes acumular métricas de entrenamiento, mantener un batch de muestras ni representar un vector de características antes de NumPy — cada patrón de datos repetido requiere una variable separada.
Un literal de lista se escribe con corchetes: [1, 2, 3]. La indexación usa lista[i] (base 0; los índices negativos cuentan desde el final). El slicing devuelve una nueva lista: lista[inicio:fin:paso] — fin es exclusivo. Las listas son mutables — a diferencia de los strings, puedes cambiar elementos individuales en su lugar.
Python (in browser)
Todas estas mutaciones ocurren en su lugar — no se devuelve ninguna lista nueva.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Dos métodos ordenan una lista de formas diferentes. .sort() muta la lista en su lugar y devuelve None. sorted() es una función integrada que deja la lista original intacta y devuelve una nueva lista ordenada. La misma asimetría aplica a .reverse() vs reversed().
Python (in browser)
`sorted()` es no destructivo y funciona sobre cualquier iterable. `.sort()` es en su lugar y solo para listas. Siempre imprime el valor de retorno de `.sort()` una vez — ver `None` hace que el patrón quede grabado.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
Python (in browser)
La asignación copia la *referencia*, no los datos. Usa `.copy()` o `a[:]` para obtener una copia superficial independiente.
Python runs entirely in your browser via Pyodide (~6 MB on first Run, cached after).
¿Qué devuelve `[1, 2, 3].sort()`?
Practica indexación, slicing y la API completa de mutación de listas en el Arena con tests del lado del servidor.
Una lista de números es lo más cercano que tiene Python a un vector matemático. El capítulo 2 de MML cubre los vectores como tuplas ordenadas en Rⁿ — la misma idea `[x₁, x₂, ..., xₙ]` que pronto pasarás a NumPy.
- Las listas son ordenadas y mutables — indexa con `lista[i]`, corta con `lista[a:b]`, muta con `.append()`, `.pop()`, `.insert()`, `.remove()`, `.extend()`.
- `.sort()` muta en su lugar y devuelve `None`; `sorted()` devuelve una nueva lista ordenada. Nunca escribas `mi_lista = mi_lista.sort()`.
- `b = a` crea un alias, no una copia. Usa `b = a.copy()` o `b = a[:]` para obtener una lista independiente.
La pérdida de entrenamiento se acumula como `history = []; history.append(epoch_loss)` después de cada época. Los mini-batches son slices de una lista de características: `batch = dataset[i:i+batch_size]`. Los arreglos de características se construyen como listas planas antes de pasarse a NumPy: `features = [fila['edad'], fila['ingresos'], fila['puntaje']]`.
Si lo quitas: Sin listas, acumular métricas por época requiere preasignar una estructura de tamaño fijo — necesitarías saber de antemano cuántas épocas ejecutarás, lo que anula el propósito del entrenamiento adaptativo.