Skip to content

📙 Clase 01 — Listas

Fase 1 · Estructuras de datos y bucles ⬅️ Volver al índice de clases

🎯 Qué aprendí

  • Qué es una lista y por qué es la colección más usada de Python.
  • Crear, leer (indexar), agregar, quitar y ordenar elementos.
  • El gotcha del aliasing (b = a NO copia) y cómo se usa una lista en tu app de escritorio.

📖 PARTE TEÓRICA

📦 1. ¿Qué es una lista?

Una lista es una caja ordenada que guarda varios valores en una sola variable. Se escribe con corchetes [] y los elementos van separados por comas. Puede mezclar tipos, crecer y encogerse: es mutable (se puede cambiar después de crearla).

python
frutas = ["manzana", "pera", "uva"]   # una lista de 3 textos
numeros = [10, 20, 30]                 # una lista de números
mezcla  = ["Ana", 30, True]            # puede mezclar tipos (aunque no suele ser buena idea)
vacia   = []                           # lista vacía, para ir llenándola

💡 Piensa en una lista como una fila de casilleros numerados. Cada casillero tiene un índice (su posición) y guarda un valor.

🔢 2. Indexar: leer por posición

Cada elemento tiene un índice que empieza en 0. Los índices negativos cuentan desde el final.

python
frutas = ["manzana", "pera", "uva"]
#            0          1       2      ← índices normales
#           -3         -2      -1      ← índices negativos

print(frutas[0])    # manzana  (el primero)
print(frutas[-1])   # uva      (el último, sin saber cuántos hay)
print(len(frutas))  # 3        (cuántos elementos tiene)

Diagrama mental:

índice:   0          1        2
        ┌──────────┬────────┬───────┐
frutas: │ manzana  │ pera   │ uva   │
        └──────────┴────────┴───────┘
índice:  -3         -2       -1

⚠️ Si pides un índice que no existe (frutas[100]) Python lanza IndexError: list index out of range. La app se cae si no lo controlas → en la Fase 2 verás try/except para atraparlo.

🛠️ 3. Métodos: agregar y quitar

MétodoQué haceEjemplo (sobre ["a","b"])
.append(x)Agrega x al final→ ["a","b","x"]
.insert(i, x)Inserta x en la posición i.insert(1,"z") → ["a","z","b"]
.remove(x)Quita la primera aparición de x.remove("a") → ["b"]
.pop()Saca y devuelve el último→ "b", lista ["a"]
.pop(i)Saca y devuelve el de la posición i.pop(0) → "a"
.extend([...])Pega otra lista al final.extend(["c"]) → ["a","b","c"]
.clear()Vacía la lista→ []
python
frutas = ["manzana", "pera", "uva"]
frutas.append("kiwi")      # ['manzana', 'pera', 'uva', 'kiwi']
frutas.insert(1, "mango")  # ['manzana', 'mango', 'pera', 'uva', 'kiwi']
frutas.remove("pera")      # ['manzana', 'mango', 'uva', 'kiwi']
ultimo = frutas.pop()      # ultimo='kiwi'  ->  ['manzana', 'mango', 'uva']

💡 .append es el método que más vas a usar: es "el usuario agregó algo, guárdalo".

🔎 4. Buscar y contar

python
frutas = ["manzana", "uva", "kiwi"]
print("uva" in frutas)        # True   ← ¿está?  (lo más común)
print(frutas.index("uva"))    # 1      ← ¿en qué posición está?
print(["a","a","b"].count("a"))  # 2   ← ¿cuántas veces aparece?

🧪 Tip de entrevista: para preguntar "¿existe X en la lista?" usa x in lista, no un bucle manual. Es más rápido de escribir y de leer.

🔀 5. Ordenar: sort() vs sorted()

FormaQué hace¿Modifica la original?
lista.sort()Ordena la misma lista (in-place), devuelve None
sorted(lista)Devuelve una lista nueva ordenadaNo, la original queda igual
python
nums = [3, 1, 2]
nums.sort()                 # nums ahora es [1, 2, 3]
nums.sort(reverse=True)     # [3, 2, 1]  (descendente)

original = [3, 1, 2]
nueva = sorted(original)    # nueva=[1,2,3], original sigue [3,1,2]

⚠️ Error clásico: x = lista.sort(). sort() devuelve None, así que x queda en None. Si quieres una copia ordenada, usa sorted(...).

🚨 6. El gran gotcha: aliasing (b = a NO copia)

Una lista es un objeto; la variable solo es una etiqueta que apunta a él. Si haces b = a, ambas etiquetas apuntan a la misma lista. Cambiar una cambia "las dos".

python
a = [1, 2, 3]
b = a            # b NO es una copia: es OTRO nombre para la MISMA lista
b.append(99)
print(a)         # [1, 2, 3, 99]  ← ¡también cambió "a"!

Para copiar de verdad, usa .copy() (o a[:], que verás en Slicing):

python
a = [1, 2, 3]
c = a.copy()     # c es una lista NUEVA con los mismos valores
c.append(0)
print(a)         # [1, 2, 3]        ← intacta
print(c)         # [1, 2, 3, 0]
b = a  (aliasing)                 c = a.copy()  (copia real)
  a ─┐                              a ─▶ [1,2,3]
     ├─▶ [1,2,3,99]                 c ─▶ [1,2,3]  (otra caja)
  b ─┘

🧪 Tip de entrevista: "¿b = a copia la lista?" → No. Copia la referencia. Ambas apuntan al mismo objeto. Para copiar: a.copy(), a[:] o list(a).


🖥️ EN TU APP DE ESCRITORIO

En una app, la lista es el modelo de datos: lo que el usuario ve en pantalla suele ser el reflejo de una lista en memoria. Tu Lista de tareas es el ejemplo perfecto.

python
# El "cerebro" de una To-Do es una simple lista de textos:
tareas = []

def agregar_tarea():
    texto = entry.get()            # CTkEntry.get() -> lo que escribió el usuario
    if texto:                      # si no está vacío (truthy)
        tareas.append(texto)       # 1) guardar en el modelo
        pintar_lista()             # 2) redibujar la pantalla

def borrar_tarea(indice):
    tareas.pop(indice)             # sacar del modelo por posición
    pintar_lista()                 # y volver a pintar

Patrón clave (lo repetirás toda tu vida programando GUIs):

usuario hace algo  →  modificas la LISTA (append/pop)  →  vuelves a PINTAR la pantalla

Otros usos de listas en tus apps:

En tu appLa lista guarda
To-Dolos textos de las tareas
Agendalos contactos (luego, mejor: lista de diccionarios)
CTkComboBox / CTkOptionMenulas opciones del desplegable: values=["Perú","Chile"]
Resultados de una búsquedalas filas a mostrar

💡 Un CTkOptionMenu(app, values=paises) recibe directamente una lista. Si agregas un país a la lista y llamas menu.configure(values=paises), el desplegable se actualiza.


🗄️ CON BASE DE DATOS (caso de uso)

Cuando en la Fase 6 guardes en SQLite, cada SELECT te devuelve una lista de filas. Recorrer esa lista para pintarla es idéntico a recorrer tareas:

python
filas = con.execute("SELECT texto FROM tareas").fetchall()  # -> lista de filas
# 'filas' es una lista; se recorre igual que cualquier lista (lo verás en la Clase 02)

🗄️ Idea a sembrar: la lista en memoria y la tabla en disco son lo mismo, en dos sitios. La app trabaja con la lista; la BD la conserva entre ejecuciones.


🏋️ EJERCICIOS CON SOLUCIÓN

Ejercicio 1 — El podio

Tienes corredores = ["Ana", "Luis", "Marta", "Beto"]. Imprime el primero y el último sin contar a mano cuántos hay.

Ver solución
python
corredores = ["Ana", "Luis", "Marta", "Beto"]
print("Ganador:", corredores[0])     # Ana
print("Último:",  corredores[-1])    # Beto   (negativo = desde el final)

Ejercicio 2 — Mini carrito

Empieza con carrito = []. Agrega "pan" y "leche", inserta "huevos" al inicio, quita "pan" y muestra cuántos productos quedan.

Ver solución
python
carrito = []
carrito.append("pan")
carrito.append("leche")
carrito.insert(0, "huevos")   # ['huevos', 'pan', 'leche']
carrito.remove("pan")         # ['huevos', 'leche']
print(carrito, "→", len(carrito), "productos")   # ['huevos', 'leche'] → 2 productos

Ejercicio 3 — Copia segura (el gotcha)

Dada original = [5, 10, 15], crea respaldo de forma que agregar a respaldo no afecte a original. Demuéstralo.

Ver solución
python
original = [5, 10, 15]
respaldo = original.copy()    # copia REAL (no 'respaldo = original')
respaldo.append(20)
print(original)   # [5, 10, 15]      ← intacta
print(respaldo)   # [5, 10, 15, 20]

❓ Preguntas y respuestas (autoevaluación)

1. ¿En qué índice está el primer elemento de una lista?

En el 0. El último está en len(lista) - 1, o más fácil, en -1.

2. ¿Qué diferencia hay entre .append(x) y .insert(0, x)?

append agrega al final; insert(0, x) agrega al inicio (posición 0).

3. lista.sort() ¿devuelve la lista ordenada?

No: ordena en el sitio y devuelve None. Para obtener una copia ordenada usa sorted(lista).

4. Después de b = a, si haces b.append(9), ¿cambia a?

Sí. b = a no copia: ambos nombres apuntan a la misma lista. Para copiar: a.copy().


📎 Apuntes relacionados

➡️ Siguiente

Clase 02 · Bucles for — recorrer la lista que acabas de aprender.