Semestre 02, 2026
Se requiere guardar las notas de un curso completo.
nota1 = 85
nota2 = 90
nota3 = 78
Con treinta estudiantes se necesitarían treinta nombres distintos, y ninguno de ellos se puede recorrer con un ciclo. Hace falto una estructura que guarde muchos valores bajo una sola variable.
Una lista es una colección ordenada de valores almacenados en una sola variable. Los elementos se escriben entre corchetes y se separan por comas.
notas = [85, 90, 78]
frutas = ["manzana", "naranja", "uva"]
datos = [True, 42, "Python", 3.14]
Los elementos pueden ser de cualquier tipo y pueden mezclarse en una misma lista. El orden importa, porque cada elemento conserva la posición en la que se escribió.
| Sin lista | Con lista |
|---|---|
| nota1 = 85 | notas = [85, 90, 78] |
| Tres nombres distintos | Una sola variable |
| Tres líneas para imprimir | Se puede recorrer con un ciclo |
lista = []
Sirve cuando los valores todavía no se conocen y la lista se construye poco a poco mientras el programa corre.
La función len devuelve la cantidad de elementos.
frutas = ["manzana", "naranja", "uva", "mango"]
print(len(frutas)) # 4
print(len([])) # 0
Cada elemento de una lista tiene una posición llamada índice. La numeración empieza en cero.
| Elemento | manzana | naranja | uva | mango |
|---|---|---|---|---|
| Índice | 0 | 1 | 2 | 3 |
| Desde el final | -4 | -3 | -2 | -1 |
El índice se escribe entre corchetes después del nombre de la lista.
frutas = ["manzana", "naranja", "uva", "mango"]
print(frutas[0]) # manzana
print(frutas[1]) # naranja
print(frutas[3]) # mango
Los índices negativos cuentan desde el final hacia atrás.
frutas = ["manzana", "naranja", "uva", "mango"]
print(frutas[-1]) # mango
print(frutas[-2]) # uva
print(frutas[-4]) # manzana
Permiten tomar el último elemento sin conocer la longitud de la lista.
A diferencia de los strings, las listas sí se pueden modificar.
frutas = ["manzana", "naranja", "uva"]
frutas[1] = "limón"
print(frutas) # ['manzana', 'limón', 'uva']
La asignación reemplaza el valor en esa posición y no crea una lista nueva. Las listas son mutables.
frutas = ["manzana", "naranja", "uva"]
print(frutas[3]) # IndexError
El índice máximo es la longitud de la lista menos uno. Una lista de tres elementos llega hasta el índice dos.
Un slice extrae una porción de la lista. Se escribe con el índice inicial y el final separados por dos puntos.
lista[inicio:fin]
El elemento en la posición final no se incluye.
numeros = [10, 20, 30, 40, 50]
print(numeros[1:4]) # [20, 30, 40]
La cantidad de elementos que devuelve un slice es el final menos el inicio. El slice resultante es una lista nueva.
numeros = [10, 20, 30, 40, 50]
print(numeros[:3]) # [10, 20, 30]
print(numeros[2:]) # [30, 40, 50]
print(numeros[:]) # [10, 20, 30, 40, 50]
Omitir un extremo evita tener que calcular la longitud de la lista.
Un tercer valor indica cada cuántos elementos se avanza.
numeros = [10, 20, 30, 40, 50, 60]
print(numeros[::2]) # [10, 30, 50]
print(numeros[::-1]) # [60, 50, 40, 30, 20, 10]
Un paso negativo recorre la lista de derecha a izquierda, así que invertir una lista cabe en una sola expresión.
Un método es una función que pertenece a un tipo de dato. Se llama escribiendo un punto después de la variable.
lista.metodo()
frutas = ["manzana", "naranja"]
frutas.append("uva")
print(frutas) # ['manzana', 'naranja', 'uva']
append agrega siempre un elemento al final de la lista y recibe un solo valor por llamada.
frutas = ["manzana", "naranja", "uva"]
frutas.insert(1, "limón")
print(frutas) # ['manzana', 'limón', 'naranja', 'uva']
insert recibe primero la posición y después el valor. Los elementos que estaban en esa posición y las siguientes se desplazan hacia la derecha.
frutas = ["manzana", "naranja", "uva"]
frutas.remove("naranja")
print(frutas) # ['manzana', 'uva']
remove recibe el valor, no la posición, y elimina solo la primera aparición. Si el valor no está en la lista produce un error.
frutas = ["manzana", "naranja", "uva"]
eliminado = frutas.pop(1)
print(eliminado) # naranja
print(frutas) # ['manzana', 'uva']
pop recibe la posición y devuelve el elemento que eliminó. Sin argumento elimina el último.
| Método | Qué recibe | Qué devuelve |
|---|---|---|
| remove(valor) | El valor a eliminar | Nada |
| pop(indice) | La posición a eliminar | El elemento eliminado |
| pop() | Nada | El último elemento |
Conviene usar remove cuando se conoce el dato y pop cuando se conoce la posición o se necesita el valor eliminado.
numeros = [5, 2, 8, 1, 9, 3]
numeros.sort()
print(numeros) # [1, 2, 3, 5, 8, 9]
frutas = ["uva", "manzana", "naranja"]
frutas.sort()
print(frutas) # ['manzana', 'naranja', 'uva']
sort ordena la lista original en lugar de devolver una copia. Los números quedan de menor a mayor y los textos en orden alfabético.
numeros = [5, 2, 8, 1, 9]
numeros.sort(reverse=True)
print(numeros) # [9, 8, 5, 2, 1]
El argumento reverse invierte el criterio de orden, así que la lista queda de mayor a menor.
numeros = [1, 2, 3, 4, 5]
numeros.reverse()
print(numeros) # [5, 4, 3, 2, 1]
reverse invierte el orden actual sin ordenar nada, mientras que sort con reverse en verdadero primero ordena y luego entrega de mayor a menor.
frutas = ["manzana", "naranja", "uva"]
pos = frutas.index("naranja")
print(pos) # 1
index devuelve la posición de la primera aparición del valor y no modifica la lista. Si el valor no existe produce un error.
numeros = [1, 2, 2, 3, 2, 4]
print(numeros.count(2)) # 3
print(numeros.count(5)) # 0
count cuenta cuántas veces aparece un valor y devuelve cero cuando no aparece ninguna.
lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
lista1.extend(lista2)
print(lista1) # [1, 2, 3, 4, 5, 6]
extend recorre la lista que recibe y agrega sus elementos uno por uno al final.
lista = [1, 2, 3]
lista.append([4, 5]) # [1, 2, 3, [4, 5]]
otra = [1, 2, 3]
otra.extend([4, 5]) # [1, 2, 3, 4, 5]
append agrega el argumento completo como un único elemento, aunque ese argumento sea otra lista. extend agrega los elementos que contiene.
frutas = ["manzana", "naranja", "uva"]
frutas.clear()
print(frutas) # []
clear elimina todos los elementos y deja la lista vacía. La variable sigue existiendo.
| Método | Qué hace |
|---|---|
| append(v) | Agrega v al final |
| insert(i, v) | Inserta v en la posición i |
| extend(lista) | Agrega todos los elementos de otra lista |
| remove(v) | Elimina la primera aparición de v |
| pop(i) | Elimina y devuelve el elemento en i |
| clear() | Elimina todos los elementos |
| Método | Qué hace | Modifica |
|---|---|---|
| sort() | Ordena de menor a mayor | Sí |
| reverse() | Invierte el orden actual | Sí |
| index(v) | Devuelve la posición de v | No |
| count(v) | Cuenta las apariciones de v | No |
El ciclo for recorre los elementos sin necesidad de índices.
frutas = ["manzana", "naranja", "uva"]
for fruta in frutas:
print(fruta)
Se imprimen manzana, naranja y uva, cada una en su propia línea. La variable del ciclo recibe un elemento por vuelta.
Se requiere el promedio de las notas de un grupo.
notas = [85, 90, 78, 92, 70]
total = 0
for nota in notas:
total = total + nota
promedio = total / len(notas)
print("Promedio:", promedio) # Promedio: 83.0
Cuando además del valor se necesita saber en qué posición está.
frutas = ["manzana", "naranja", "uva"]
for i in range(len(frutas)):
print(i, frutas[i])
range con len produce exactamente los índices válidos, desde cero hasta la longitud menos uno.
Se requiere el valor más alto de una lista de números sin usar funciones ya hechas.
numeros = [5, 2, 8, 1, 9, 3]
mayor = numeros[0]
for numero in numeros:
if numero > mayor:
mayor = numero
print("El mayor es:", mayor) # El mayor es: 9
| Iteración | numero | mayor |
|---|---|---|
| inicio | — | 5 |
| 1 | 5 | 5 |
| 2 | 2 | 5 |
| 3 | 8 | 8 |
| 4 | 1 | 8 |
| 5 | 9 | 9 |
| 6 | 3 | 9 |
El ciclo while recorre la lista con un índice que se actualiza a mano.
frutas = ["manzana", "naranja", "uva"]
i = 0
while i < len(frutas):
print(frutas[i])
i = i + 1
La condición compara el índice con la longitud, lo que evita salirse del rango. La última línea es la que hace avanzar el recorrido.
| i | i < 3 | frutas[i] | i después |
|---|---|---|---|
| 0 | Sí | manzana | 1 |
| 1 | Sí | naranja | 2 |
| 2 | Sí | uva | 3 |
| 3 | No | — termina — | — |
Se requiere imprimir los elementos del último al primero.
numeros = [10, 20, 30, 40, 50]
i = len(numeros) - 1
while i >= 0:
print(numeros[i])
i = i - 1
El índice arranca en la última posición y se decrementa hasta llegar a cero, que todavía es un índice válido.
| Criterio | for | while |
|---|---|---|
| Recorrer todos los elementos | Más simple | Funciona |
| Control del índice | Indirecto | Total |
| Recorrer hacia atrás | Con un slice de paso negativo | Natural |
| Riesgo de ciclo infinito | No | Sí, si no avanza el índice |
Se parte de una lista fija de seis números. Los deslizadores cambian el inicio, el fin y el paso, y las casillas resaltadas son las que quedan dentro de la rebanada.
Cada botón ejecuta un método sobre la misma lista y la bitácora muestra la llamada con su resultado. El valor y la posición que reciben los métodos se eligen con los deslizadores.
Se requiere encontrar el valor más alto de una lista. El deslizador avanza una iteración a la vez y muestra qué elemento se está comparando y cómo queda la variable que guarda el mayor.
frutas = ["manzana", "naranja", "uva"]
print(frutas[3]) # IndexError
La lista tiene tres elementos, así que los índices válidos son cero, uno y dos. Para el último elemento conviene usar menos uno, que nunca se pasa.
frutas = ["manzana", "naranja", "uva"]
i = 0
while i < len(frutas):
print(frutas[i])
Falta la línea que incrementa el índice, por lo que la condición siempre es verdadera y el ciclo no termina. Es el error más frecuente al recorrer con while.
lista = [1, 2]
lista.append([3, 4])
print(lista) # [1, 2, [3, 4]]
append metió la lista completa como un solo elemento. Para agregar los valores individuales se usa extend.
numeros = [1, 2, 3, 4, 5]
for numero in numeros:
numeros.remove(numero)
print(numeros) # [2, 4]
Al eliminar un elemento los demás se desplazan y el ciclo se salta posiciones. La solución es recorrer una copia o construir una lista nueva con los elementos que se conservan.
frutas = ["manzana", "naranja", "uva"]
frutas.remove(1) # ValueError
frutas.pop("uva") # TypeError
remove recibe el valor y pop recibe la posición. Escribirlos al revés produce un error aunque el dato exista en la lista.
| Operación | Para qué sirve |
|---|---|
| len(lista) | Cuántos elementos tiene |
| lista[i] | Obtener un elemento |
| lista[i] = v | Reemplazar un elemento |
| lista[a:b] | Extraer una porción |
| for x in lista | Recorrer los valores |
| for i in range(len(lista)) | Recorrer con el índice |
Las listas ubican sus elementos por posición. Cuando el dato se busca por un nombre y no por un número, la estructura adecuada es el diccionario, tema de la próxima clase.