Recorrer Listas
Aprende a recorrer listas en Python con bucles for, while, enumerate(), zip(), break, continue y comprensiones de listas con ejemplos.
Recorrer una lista — visitar cada elemento uno por uno — es una de las operaciones más comunes en Python. Este capítulo cubre todas las formas prácticas de hacerlo: bucles for, bucles while, enumerate(), zip(), break y continue, y comprensiones de listas. También explica los errores comunes a tener en cuenta al modificar una lista mientras se itera.
¿Por qué recorrer una lista?
Una lista de Python contiene una secuencia ordenada de elementos. Los bucles te permiten actuar sobre cada elemento sin escribir una línea de código por elemento. Ya sea que estés sumando precios, filtrando registros o transformando cadenas de texto, un bucle suele ser la herramienta adecuada.
Recorrer con un bucle for
La forma más simple y legible de iterar sobre una lista es un bucle for.
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
print(fruit)apple
banana
cherryPython asigna cada elemento a fruit por turno, ejecuta el bloque indentado y luego pasa al siguiente elemento. El bucle se detiene automáticamente cuando se agota la lista — no se necesita gestión de índices.
Recorrer con range() y un índice
Cuando necesitas tanto el índice como el valor, puedes combinar range() con len():
colors = ['red', 'green', 'blue']
for i in range(len(colors)):
print(i, colors[i])0 red
1 green
2 blueEsto funciona, pero enumerate() (tratado a continuación) es más limpio para este patrón.
Recorrer con enumerate()
enumerate() empareja cada elemento con su índice y es el enfoque idiomático de Python cuando necesitas ambos:
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
print(index, fruit)0 apple
1 banana
2 cherryPuedes comenzar el contador en un número diferente pasando un segundo argumento:
for index, fruit in enumerate(['apple', 'banana', 'cherry'], start=1):
print(index, fruit)1 apple
2 banana
3 cherryRecorrer dos listas con zip()
zip() empareja elementos de dos (o más) listas para que puedas iterarlos en paralelo:
names = ['Alice', 'Bob', 'Carol']
scores = [92, 85, 78]
for name, score in zip(names, scores):
print(name, '->', score)Alice -> 92
Bob -> 85
Carol -> 78Si las listas tienen longitudes diferentes, zip() se detiene en la más corta. Usa itertools.zip_longest() si necesitas continuar hasta el final de la lista más larga.
Recorrer con un bucle while
Un bucle while sigue ejecutándose mientras una condición sea True. Tú gestionas el índice manualmente:
numbers = [10, 20, 30, 40, 50]
i = 0
while i < len(numbers):
print(numbers[i])
i += 110
20
30
40
50Los bucles while son útiles cuando la condición de parada no es simplemente "fin de la lista" — por ejemplo, buscar un elemento y detenerse tan pronto como se encuentre.
Controlar la ejecución del bucle
break — Salir anticipadamente
break detiene el bucle de inmediato. Esto es útil cuando has encontrado lo que buscabas y no necesitas seguir iterando:
fruits = ['apple', 'banana', 'cherry', 'date']
for fruit in fruits:
if fruit == 'cherry':
print('Found it!')
break
print(fruit)apple
banana
Found it!continue — Saltar un elemento
continue salta a la siguiente iteración sin ejecutar las líneas restantes del bloque actual:
numbers = [1, 2, 3, 4, 5, 6]
for n in numbers:
if n % 2 == 0:
continue # skip even numbers
print(n)1
3
5La cláusula else en un bucle
Un bucle for o while puede tener un bloque else que se ejecuta cuando el bucle termina sin haber alcanzado un break. Esto es útil para patrones de "buscar y reportar":
target = 7
numbers = [1, 3, 5, 9]
for n in numbers:
if n == target:
print('Found', target)
break
else:
print(target, 'not in list')7 not in listRecorrer un segmento de lista
Puedes iterar sobre una parte de una lista segmentándola:
items = ['a', 'b', 'c', 'd', 'e']
for item in items[1:4]: # indices 1, 2, 3
print(item)b
c
dRecorrer en orden inverso con un segmento:
for item in items[::-1]:
print(item)e
d
c
b
aBucles anidados
Puedes anidar bucles for para trabajar con listas de listas o calcular combinaciones:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
for row in matrix:
for value in row:
print(value, end=' ')
print()1 2 3
4 5 6
7 8 9 El bucle interior completa todas sus iteraciones por cada iteración individual del bucle exterior.
Comprensiones de listas como alternativa al bucle
Una comprensión de lista crea una nueva lista aplicando una expresión a cada elemento — es una alternativa compacta y legible a un bucle for que construye una lista:
numbers = [1, 2, 3, 4, 5]
# for loop approach
squares = []
for n in numbers:
squares.append(n ** 2)
# list comprehension — same result in one line
squares = [n ** 2 for n in numbers]
print(squares)[1, 4, 9, 16, 25]Puedes añadir una condición para filtrar elementos al mismo tiempo:
evens = [n for n in range(1, 11) if n % 2 == 0]
print(evens)[2, 4, 6, 8, 10]Error común: modificar una lista mientras se itera
No añadas ni elimines elementos de una lista dentro de un bucle for que itera sobre esa misma lista. El índice interno del bucle se basa en la longitud original, por lo que los elementos pueden saltarse o visitarse dos veces.
# BAD — skips items
numbers = [1, 2, 3, 4, 5]
for n in numbers:
if n % 2 == 0:
numbers.remove(n) # mutates the list mid-loop
print(numbers) # [1, 3, 5] may look correct here but...El patrón seguro es iterar sobre una copia de la lista, o construir una nueva lista con una comprensión:
numbers = [1, 2, 3, 4, 5]
numbers = [n for n in numbers if n % 2 != 0]
print(numbers)[1, 3, 5]Operaciones básicas de lista usadas con bucles
Las secciones a continuación recapitulan los métodos de lista más utilizados junto con los bucles. Consulta Métodos de lista de Python para la referencia completa.
Añadir elementos
my_list = [1, 2, 3]
my_list.append(4)
print(my_list)[1, 2, 3, 4]Eliminar elementos
remove() elimina el primer valor coincidente y lanza un ValueError si el elemento no se encuentra.
my_list = [1, 2, 3, 4, 5]
my_list.remove(3)
print(my_list)[1, 2, 4, 5]Ordenar una lista
my_list = [3, 1, 4, 2, 5]
my_list.sort()
print(my_list)[1, 2, 3, 4, 5]sort() modifica la lista en su lugar. Para obtener una copia ordenada sin cambiar el original, usa la función integrada sorted(). Consulta Ordenar listas para ordenar en reversa, ordenar por clave y más.
Temas relacionados
- Listas de Python — crear, indexar y segmentar listas
- Bucles for en Python — la referencia completa del bucle
for - Bucles while en Python — sintaxis y patrones del bucle
while - Comprensión de listas — construcción compacta de listas en una línea
- Métodos de lista —
append,extend,pop,inserty más - Ordenar listas — ordenar en su lugar vs. copias ordenadas
- Eliminar elementos de una lista —
remove,pop,delyclear - Recorrer diccionarios — iterar sobre pares clave–valor
- Recorrer tuplas — iterar sobre secuencias inmutables