HOWTO · Python
Cómo hacer un bucle a través de múltiples listas en Python
Demuestra cómo usar la función zip() y sus hermanos para iterar a través de múltiples iterables en Python. También proporciona fragmentos de código de las funciones zip(), itertools.izip() e itertools.zip_longest() y explica cómo usarlas tanto en Python 2 como en 3.
En esta página
Este tutorial explica cómo iterar a través de dos listas/tuplas al mismo tiempo en Python. Usaremos zip() y itertools.zip_longest() y explicaremos las diferencias entre ellas y cómo usar cada una. También veremos cómo el tipo de retorno zip() es diferente en Python 2 y 3.
zip() Función en Python 3.x
La función zip() acepta múltiples listas/tuplas como argumentos y devuelve un objeto zip, que es un iterador de tuplas.
Usa zip() para iterar a través de dos listas
Pasa ambas listas a la función zip() y úsalas para el bucle para iterar a través del iterador de resultados.
listA = [1, 2, 3, 4]
listB = [10, 20, 30, 40]
for a, b in zip(listA, listB):
print(a, b)
Resultado:
1 10
2 20
3 30
4 40
Usa zip() para iterar a través de dos listas con diferentes longitudes
Si las listas tienen diferentes longitudes, zip() se detiene cuando la lista más corta termina. Vea el código a continuación.
listA = [1, 2, 3, 4, 5, 6]
listB = [10, 20, 30, 40]
for a, b in zip(listA, listB):
print(a, b)
Resultado:
1 10
2 20
3 30
4 40
Use itertools.zip_longest() para Iterar a través de dos listas
Si necesitas iterar a través de dos listas hasta que la más larga termine, usa itertools.zip_longest(). Funciona igual que la función zip() excepto que se detiene cuando termina la lista más larga.
Llena los valores vacíos con None, y devuelve un iterador de tuplas.
import itertools
listA = [1, 2, 3, 4, 5, 6]
listB = [10, 20, 30, 40]
for a, b in itertools.zip_longest(listA, listB):
print(a, b)
Resultado:
1 10
2 20
3 30
4 40
5 None
6 None
El fillvalue por defecto es None, pero puedes poner fillvalue a cualquier valor.
import itertools
listA = [1, 2, 3, 4, 5, 6]
listB = [10, 20, 30, 40]
for a, b in itertools.zip_longest(listA, listB, fillvalue=0):
print(a, b)
Resultado:
1 10
2 20
3 30
4 40
5 0
6 0
Usa zip() con múltiples listas
zip() y sus funciones de hermano pueden aceptar más de dos listas.
import itertools
codes = [101, 102, 103]
students = ["James", "Noah", "Olivia"]
grades = [65, 75, 80]
for a, b, c in itertools.zip_longest(codes, students, grades, fillvalue=0):
print(a, b, c)
Resultado:
101 James 65
102 Noah 75
103 Olivia 80
zip() Función en Python 2.x
La función zip() en Python 2.x también acepta múltiples listas/tuplas como argumentos pero devuelve una lista de tuplas. Eso funciona bien para listas pequeñas, pero si tienes listas enormes, deberías usar itertools.izip() en su lugar, porque devuelve un iterador de tuplas.
Usa itertools.izip() para Iterar a través de dos listas
import itertools
listA = [1, 2, 3, 4]
listB = [10, 20, 30, 40]
for a, b in itertools.izip(listA, listB):
print(a, b)
Resultado:
1 10
2 20
3 30
4 40