Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Listas (El Estante Numerado)

Estante con cuatro ranuras numeradas [0][1][2][3]: cada posición es un índice de lista

Fig. 5.2: Una lista: estante de ranuras numeradas desde cero.

La Lista (list) es el contenedor que más vas a usar, porque resuelve el problema más común: guardar varias cosas en un orden que se pueda recorrer. Piensa en un estante largo del almacén donde cada ranura tiene un número pintado debajo. Ese número empieza en cero, no en uno. Raro al principio, pero te acostumbras rápido.

El rasgo que la define es el ORDEN. Pon un martillo en la primera ranura y ahí se queda hasta que alguien lo mueva. No se reorganiza solo. No desaparece.

Anatomía de una Lista

  1. Ordenada: Los elementos mantienen su posición en el estante.
  2. Mutable: Puedes sacar, meter y cambiar cajas cuando quieras.
  3. Indexada: Encuentras las cosas por su número de ranura (índice).

Gestión del Estante

1. Construcción (Crear)

Los corchetes [] delimitan el estante. Lo que va dentro son las cajas, separadas por comas.

#   Nombre       : Tipo        =  [Contenido]
    herramientas : list[str]   =  ["Martillo", "Taladro", "Sierra"]

Aquí list[str] le dice a tu editor y a las herramientas de análisis que este estante debería contener solo texto. Python no lo impide al ejecutar (la etiqueta es una pista, no un candado), pero tu editor sí te lo marcará.

2. Recuperación (Leer)

Dale al robot el número de ranura y te devuelve lo que hay en esa posición.

primera_h = herramientas[0]  # "Martillo"
segunda_h = herramientas[1]  # "Taladro"

¡Ojo!: en programación, siempre contamos desde 0.

  • Posición 1 → Índice 0
  • Posición 2 → Índice 1

También cuentas desde el final con índices negativos, y sacas tramos enteros con el rebanado, igual que con el texto del capítulo anterior:

print(herramientas[-1])   # "Sierra"  (la última, sin contar cuántas hay)
print(herramientas[0:2])  # ["Martillo", "Taladro"]  (el índice 2 queda fuera)
print(herramientas[1:])   # ["Taladro", "Sierra"]

Rebanar una lista te devuelve otra lista (un tramo del estante), no un solo elemento.

Pedir una ranura que no existe no te da None ni una casilla vacía: revienta el programa.

herramientas: list[str] = ["Martillo", "Taladro", "Sierra"]
print(herramientas[10])
Traceback (most recent call last):
  File "almacen.py", line 2, in <module>
    print(herramientas[10])
          ~~~~~~~~~~~~^^^^
IndexError: list index out of range

(“El índice de la lista está fuera de rango”: pediste la ranura 10 en un estante de solo 3.)

3. Modificación (Escribir)

Cambiar el contenido de una ranura es directo: apuntas al índice y asignas. Para añadir una ranura nueva al final, usas append.

# Reemplazar: Quitamos "Taladro" y ponemos "Destornillador" en la ranura 1
herramientas[1] = "Destornillador"

# Ampliar: Agregamos una ranura nueva al final para "Clavos"
herramientas.append("Clavos")

4. Inventario Rápido (len)

¿Cuántas cajas hay en el estante? Para eso existe len(), una de las funciones más usadas de todo Python. Le pasas la lista y te devuelve el conteo. Sin recorrer nada a mano.

total: int = len(herramientas)
print(total)  # 4

5. Sacando Cajas del Estante

Hay dos formas de retirar mercancía, y la diferencia está en qué sabes de la caja:

  • Conoces el contenido: usa .remove(valor). Busca la primera caja con ese valor y la saca.
  • Conoces la ranura: usa del lista[indice]. Vacía esa posición directamente.
# Por contenido: fuera la sierra, esté donde esté
herramientas.remove("Sierra")

# Por posición: vacía la ranura 0 (adiós, "Martillo")
del herramientas[0]

En ambos casos el estante se compacta solo: las cajas de la derecha se corren para llenar el hueco. No quedan ranuras vacías.

6. Maniobras Avanzadas del Estante

Cuatro maniobras más y tienes la licencia completa de montacargas:

repuestos = ["Martillo", "Sierra", "Taladro"]

# insert: mete una caja EN una ranura y recorre el resto a la derecha
repuestos.insert(1, "Nivel")   # ["Martillo", "Nivel", "Sierra", "Taladro"]

# pop: saca la caja y TE LA DA (remove y del la tiran)
ultima = repuestos.pop()            # saca "Taladro" y lo entrega
primera = repuestos.pop(0)          # con índice: saca "Martillo"

# +: pega dos estantes en uno nuevo
combinado = repuestos + ["Clavos"]  # ["Nivel", "Sierra", "Clavos"]
print(combinado)

Y la maniobra que más vas a agradecer: ordenar.

precios = [50, 5, 19]

ordenados = sorted(precios)  # [5, 19, 50]: lista NUEVA, la original no cambia
precios.sort()                # ordena la original en su lugar y devuelve None

print(ordenados)
print(precios)

La regla para elegir: ¿necesitas conservar el orden original? sorted(). ¿No te importa? .sort(). El error clásico es escribir precios = precios.sort(): como .sort() devuelve None, acabas de tirar tu lista a la basura. Un detalle más: sorted() acepta cualquier colección, no solo listas, y te lo vas a encontrar de nuevo en el proyecto del Analizador de Texto.

Dos Etiquetas, un Mismo Estante (Aliasing)

Cuidado: cuando asignas una lista a otra variable, no copias el estante: pones una segunda etiqueta sobre el mismo estante físico. Le cuesta horas de depuración a quien no lo sabe.

estante_a: list[str] = ["Martillo", "Taladro"]
estante_b = estante_a        # NO es una copia: mismo estante, otra etiqueta

estante_b.append("Sierra")

Antes de imprimir estante_a, ¿qué crees que contiene? Recuerda que estante_b no es una copia.

print(estante_a)

Sale ["Martillo", "Taladro", "Sierra"]: también cambió, aunque nunca tocaste estante_a directamente.

Tocaste estante_b y estante_a “se enteró”, porque son el mismo objeto en memoria (justo lo que comprueba estante_a is estante_b). Si lo que quieres es un estante aparte, pide una copia explícita:

estante_a: list[str] = ["Martillo", "Taladro"]
estante_b = estante_a.copy()   # ahora sí, dos estantes independientes

Esto solo pasa con los tipos mutables (listas, diccionarios, conjuntos). Un int o un str no se comparten así: al reasignarlos cambias de etiqueta, no el contenido de un estante compartido.


Cuando tengas una colección de cosas que procesar una a una, la lista es tu punto de partida. Una lista de tareas, un registro de compras, los pasos de un proceso. El orden importa y las listas lo preservan. Cómo recorrerlas una por una, sin pedir cada ranura a mano, es justo lo que hace el bucle for del Capítulo 8.