Apariencia
📙 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 = aNO 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 lanzaIndexError: list index out of range. La app se cae si no lo controlas → en la Fase 2 verástry/exceptpara atraparlo.
🛠️ 3. Métodos: agregar y quitar
| Método | Qué hace | Ejemplo (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']💡
.appendes 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()
| Forma | Qué hace | ¿Modifica la original? |
|---|---|---|
lista.sort() | Ordena la misma lista | Sí (in-place), devuelve None |
sorted(lista) | Devuelve una lista nueva ordenada | No, 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()devuelveNone, así quexqueda enNone. Si quieres una copia ordenada, usasorted(...).
🚨 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 = acopia la lista?" → No. Copia la referencia. Ambas apuntan al mismo objeto. Para copiar:a.copy(),a[:]olist(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 pintarPatrón clave (lo repetirás toda tu vida programando GUIs):
usuario hace algo → modificas la LISTA (append/pop) → vuelves a PINTAR la pantallaOtros usos de listas en tus apps:
| En tu app | La lista guarda |
|---|---|
| To-Do | los textos de las tareas |
| Agenda | los contactos (luego, mejor: lista de diccionarios) |
CTkComboBox / CTkOptionMenu | las opciones del desplegable: values=["Perú","Chile"] |
| Resultados de una búsqueda | las filas a mostrar |
💡 Un
CTkOptionMenu(app, values=paises)recibe directamente una lista. Si agregas un país a la lista y llamasmenu.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 productosEjercicio 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)?
appendagrega 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 usasorted(lista).
4. Después de b = a, si haces b.append(9), ¿cambia a?
Sí.
b = ano copia: ambos nombres apuntan a la misma lista. Para copiar:a.copy().
📎 Apuntes relacionados
- Concepto resumido → 02-Conceptos
- Ejercicio práctico → Lista de tareas
- La copia con
[:]→ Clase 06 · Slicing
➡️ Siguiente
Clase 02 · Bucles for — recorrer la lista que acabas de aprender.