← CC2005

Listas

Semestre 02, 2026

Un valor por variable

  • Hasta ahora cada variable guarda un solo valor.
  • Para tres notas se declaran tres variables, cada una con su propio nombre.
  • El programa funciona mientras la cantidad de datos sea conocida y pequeña.

Variables sueltas no escalan

Se requiere guardar las notas de un curso completo.


nota1 = 85
nota2 = 90
nota3 = 78
Lo importante

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.

Listas

Definición

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"]

Qué puede contener una lista


datos = [True, 42, "Python", 3.14]
Reglas

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ó.

Ventaja de usar una lista

Sin listaCon lista
nota1 = 85notas = [85, 90, 78]
Tres nombres distintosUna sola variable
Tres líneas para imprimirSe puede recorrer con un ciclo

La lista vacía


lista = []
Utilidad

Sirve cuando los valores todavía no se conocen y la lista se construye poco a poco mientras el programa corre.

Longitud de una lista

La función len devuelve la cantidad de elementos.


frutas = ["manzana", "naranja", "uva", "mango"]

print(len(frutas))   # 4
print(len([]))       # 0

Índices

Definición

Cada elemento de una lista tiene una posición llamada índice. La numeración empieza en cero.

Elementomanzananaranjauvamango
Índice0123
Desde el final-4-3-2-1

Acceder a un elemento

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

Índices negativos

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
Utilidad

Permiten tomar el último elemento sin conocer la longitud de la lista.

Modificar un elemento

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']
Consecuencia

La asignación reemplaza el valor en esa posición y no crea una lista nueva. Las listas son mutables.

Índice fuera de rango


frutas = ["manzana", "naranja", "uva"]

print(frutas[3])   # IndexError
Regla

El índice máximo es la longitud de la lista menos uno. Una lista de tres elementos llega hasta el índice dos.

Slicing

Definición

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.

El final no se incluye


numeros = [10, 20, 30, 40, 50]

print(numeros[1:4])   # [20, 30, 40]
Atajo mental

La cantidad de elementos que devuelve un slice es el final menos el inicio. El slice resultante es una lista nueva.

Omitir el inicio o el final


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]
Comodidad

Omitir un extremo evita tener que calcular la longitud de la lista.

Slice con paso

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]
Nótese

Un paso negativo recorre la lista de derecha a izquierda, así que invertir una lista cabe en una sola expresión.

Métodos de listas

Definició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()

Tres familias de métodos

Agregar elementos con append, insert y extend
Eliminar elementos con remove, pop y clear
Reordenar con sort y reverse
Consultar con index y count

append


frutas = ["manzana", "naranja"]

frutas.append("uva")

print(frutas)   # ['manzana', 'naranja', 'uva']
Comportamiento

append agrega siempre un elemento al final de la lista y recibe un solo valor por llamada.

insert


frutas = ["manzana", "naranja", "uva"]

frutas.insert(1, "limón")

print(frutas)   # ['manzana', 'limón', 'naranja', 'uva']
Comportamiento

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.

remove


frutas = ["manzana", "naranja", "uva"]

frutas.remove("naranja")

print(frutas)   # ['manzana', 'uva']
Comportamiento

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.

pop


frutas = ["manzana", "naranja", "uva"]

eliminado = frutas.pop(1)

print(eliminado)   # naranja
print(frutas)      # ['manzana', 'uva']
Comportamiento

pop recibe la posición y devuelve el elemento que eliminó. Sin argumento elimina el último.

remove frente a pop

MétodoQué recibeQué devuelve
remove(valor)El valor a eliminarNada
pop(indice)La posición a eliminarEl elemento eliminado
pop()NadaEl último elemento
Criterio

Conviene usar remove cuando se conoce el dato y pop cuando se conoce la posición o se necesita el valor eliminado.

sort


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']
Nótese

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.

sort en orden inverso


numeros = [5, 2, 8, 1, 9]

numeros.sort(reverse=True)

print(numeros)   # [9, 8, 5, 2, 1]
Detalle

El argumento reverse invierte el criterio de orden, así que la lista queda de mayor a menor.

reverse


numeros = [1, 2, 3, 4, 5]

numeros.reverse()

print(numeros)   # [5, 4, 3, 2, 1]
Diferencia

reverse invierte el orden actual sin ordenar nada, mientras que sort con reverse en verdadero primero ordena y luego entrega de mayor a menor.

index


frutas = ["manzana", "naranja", "uva"]

pos = frutas.index("naranja")

print(pos)   # 1
Comportamiento

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.

count


numeros = [1, 2, 2, 3, 2, 4]

print(numeros.count(2))   # 3
print(numeros.count(5))   # 0
Comportamiento

count cuenta cuántas veces aparece un valor y devuelve cero cuando no aparece ninguna.

extend


lista1 = [1, 2, 3]
lista2 = [4, 5, 6]

lista1.extend(lista2)

print(lista1)   # [1, 2, 3, 4, 5, 6]
Comportamiento

extend recorre la lista que recibe y agrega sus elementos uno por uno al final.

append frente a extend


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]
Distinción

append agrega el argumento completo como un único elemento, aunque ese argumento sea otra lista. extend agrega los elementos que contiene.

clear


frutas = ["manzana", "naranja", "uva"]

frutas.clear()

print(frutas)   # []
Comportamiento

clear elimina todos los elementos y deja la lista vacía. La variable sigue existiendo.

Métodos que modifican la lista

MétodoQué 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étodos que ordenan o consultan

MétodoQué haceModifica
sort()Ordena de menor a mayorSí
reverse()Invierte el orden actualSí
index(v)Devuelve la posición de vNo
count(v)Cuenta las apariciones de vNo

Recorrer una lista con for

El ciclo for recorre los elementos sin necesidad de índices.


frutas = ["manzana", "naranja", "uva"]

for fruta in frutas:
    print(fruta)
Resultado

Se imprimen manzana, naranja y uva, cada una en su propia línea. La variable del ciclo recibe un elemento por vuelta.

Operar sobre cada elemento

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

Recorrer con el índice

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])
Nótese

range con len produce exactamente los índices válidos, desde cero hasta la longitud menos uno.

Buscar el mayor de una lista

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

Tabla de ejecución del mayor

Iteraciónnumeromayor
inicio—5
155
225
388
418
599
639

Recorrer una lista con while

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
Detalle

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.

Tabla de ejecución del while

ii < 3frutas[i]i después
0Símanzana1
1Sínaranja2
2Síuva3
3No— termina ——

Recorrer hacia atrás

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
Nótese

El índice arranca en la última posición y se decrementa hasta llegar a cero, que todavía es un índice válido.

for frente a while

Criterioforwhile
Recorrer todos los elementosMás simpleFunciona
Control del índiceIndirectoTotal
Recorrer hacia atrásCon un slice de paso negativoNatural
Riesgo de ciclo infinitoNoSí, si no avanza el índice

Rebanadas en vivo

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.

Inicio negativo para contar desde el final
Omitir un extremo para llegar hasta el borde
Paso mayor que uno para saltar elementos
Paso negativo para recorrer al revés

Rebanadas en vivo

Métodos en vivo

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.

Ver dónde cae el elemento con append e insert
Comparar remove por valor con pop por posición
Observar que sort y reverse cambian la lista original
Provocar el error de remove con un valor ausente

Métodos en vivo

Recorrido en vivo

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.

El acumulador arranca con el primer elemento
Se actualiza solo cuando aparece un valor más alto
La línea activa del código cambia en cada paso
La misma lógica escrita con for y con while

Recorrido en vivo

Índice fuera de rango


frutas = ["manzana", "naranja", "uva"]

print(frutas[3])   # IndexError
Corrección

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.

Olvidar avanzar el índice


frutas = ["manzana", "naranja", "uva"]
i = 0

while i < len(frutas):
    print(frutas[i])
Corrección

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.

Agregar una lista con append


lista = [1, 2]

lista.append([3, 4])

print(lista)   # [1, 2, [3, 4]]
Corrección

append metió la lista completa como un solo elemento. Para agregar los valores individuales se usa extend.

Modificar la lista mientras se itera


numeros = [1, 2, 3, 4, 5]

for numero in numeros:
    numeros.remove(numero)

print(numeros)   # [2, 4]
Corrección

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.

Confundir remove con pop


frutas = ["manzana", "naranja", "uva"]

frutas.remove(1)    # ValueError
frutas.pop("uva")   # TypeError
Corrección

remove recibe el valor y pop recibe la posición. Escribirlos al revés produce un error aunque el dato exista en la lista.

Resumen de operaciones

OperaciónPara qué sirve
len(lista)Cuántos elementos tiene
lista[i]Obtener un elemento
lista[i] = vReemplazar un elemento
lista[a:b]Extraer una porción
for x in listaRecorrer los valores
for i in range(len(lista))Recorrer con el índice

Elegir el recorrido

1Solo se necesitan los valores
  • for elemento in lista
2También se necesita la posición
  • for i in range(len(lista))
3El recorrido no es lineal o salta índices
  • while con un índice propio

Buenas prácticas

Nombrar la lista en plural y su elemento en singular
Verificar que el índice es válido antes de acceder
No modificar una lista mientras se recorre
Preferir el for cuando basta con los valores
Lo que sigue

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.