Listas y Tuplas
Las listas y tuplas son las secuencias ordenadas principales de Python. Las listas destacan cuando necesitas mutabilidad y métodos como sort; las tuplas señalan registros fijos y permiten la hashabilidad cuando el contenido lo permite.
Receta
nums = [3, 1, 4, 1, 5]
nums.sort()
unique_sorted = sorted(set(nums))
row = ("ada", 1842)
name, year = row
subset = nums[1:4:2]Cuándo usar esto:
- Construir colecciones ordenadas con
append/pop - Devolver resultados de múltiples valores fijos desde funciones
- Slicing y desempaquetado en procesamiento de datos
- Mantener secuencias ordenadas con
bisect
Ejemplo de Trabajo
import bisect
from typing import NamedTuple
class Event(NamedTuple):
ts: float
kind: str
def top_k(items: list[int], k: int) -> list[int]:
return sorted(items, reverse=True)[:k]
def insert_timestamped(events: list[Event], ts: float, kind: str) -> None:
bisect.insort(events, Event(ts, kind))
def partition(pred, items: list[object]) -> tuple[list[object], list[object]]:
yes, no = [], []
for item in items:
(yes if pred(item) else no).append(item)
return yes, no
if __name__ == "__main__":
timeline: list[Event] = []
insert_timestamped(timeline, 1.0, "start")
insert_timestamped(timeline, 0.5, "warmup")
print(timeline)
print(top_k([4, 1, 7, 3], 2))Lo que esto demuestra:
NamedTupleda inmutabilidad de tupla con campos nombradosbisect.insortmantiene el orden ordenado para insercionessorteddevuelve una nueva lista sin mutar la original- El retorno de tupla empaqueta dos listas relacionadas desde
partition
Inmersión Profunda
Cómo Funciona
- Listas - Arrays dinámicos; sobreasignan para un
appendamortizado O(1). - Tuplas - Tamaño fijo en la creación; menor huella de memoria que las listas.
- Slicing -
start:stop:stepcrea una copia superficial de una porción de la secuencia. - Ordenación - Timsort; estable;
key=evita la decoración manual. - bisect - Punto de inserción de búsqueda binaria para listas ordenadas.
list vs tuple
| Necesidad | Elegir |
|---|---|
| Mutar, añadir, ordenar | list |
| Clave de diccionario / miembro de conjunto | tuple (si es hashable) |
| Paquete de retorno de función | tuple o NamedTuple |
| Buffer numérico homogéneo | array.array o numpy |
Notas de Python
# copia vs vista
a = [1, 2, 3]
b = a[:] # copia superficial
c = list(a) # igual
# desempaquetado de tupla con *
first, *middle, last = (1, 2, 3, 4)Errores Comunes
- Copia superficial de lista anidada - Las listas internas todavía se comparten. Solución:
copy.deepcopy. - Ordenar tipos mixtos -
TypeErroren Python 3. Solución: Normalizar a valores comparables o usarkey. - bisect en lista no ordenada - Posición de inserción incorrecta silenciosamente. Solución: Mantener el invariante documentado o ordenar primero.
+=crea una nueva tupla -t += (1,)reasigna; no muta la tupla (inmutabilidad). Solución: Esperado - asignar una nueva tupla.- Lista grande como miembro de conjunto - Las listas no son hashables. Solución: Convertir a tupla o usar un diccionario indexado por id.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
deque | Cola/pila en ambos extremos | Necesita ordenar/acceder aleatoriamente por índice a menudo |
array.array | Tipos C numéricos compactos | Tipos de objetos mixtos |
numpy.ndarray | Numéricos vectorizados | Listas de scripts pequeños |
dataclass | Registros mutables con métodos | Necesita registro hashable/inmutable |
Preguntas Frecuentes
¿lista o tupla para valores de retorno?
La tupla es convencional para retornos de forma fija (valor, error). Usa NamedTuple cuando los campos necesiten nombres.
¿sort vs sorted?
list.sort() muta in-place devolviendo None. sorted(iterable) devuelve una nueva lista - funciona en cualquier iterable.
¿Cómo funciona el indexado negativo?
-1 es el último elemento. El slice [:-1] excluye el último elemento.
¿Cuándo vale la pena bisect?
Inserciones frecuentes en una lista mayormente ordenada donde el escaneo lineal perjudicaría - tamaños modestos siguen estando bien con lista simple.
¿Pueden las tuplas contener listas?
Sí, pero entonces la tupla no es hashable. No se puede usar como clave de diccionario.
¿Qué es list.extend vs +?
extend muta in-place. + crea una nueva lista - más lento para secuencias grandes.
¿Cómo elimino mientras itero?
Itera una copia o construye una nueva lista - mutar durante la iteración omite elementos.
¿Son las comprensiones de listas siempre mejores?
A menudo para map/filter. El bucle simple es más claro para ramas complejas o efectos secundarios.
¿Qué es key= en sort?
Calcula la clave de ordenación una vez por elemento: sorted(users, key=lambda u: u.name.lower()).
¿Cómo invierto in-place?
items.reverse() o items[::-1] para copia.
Relacionado
- Inmutabilidad y Hashabilidad - tuplas hashables
- Diccionarios - cuando las listas se convierten en valores
- heapq y Colas de Prioridad - ordenar por prioridad
- Comprensiones y Expresiones Generadoras - construir listas
Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.