zip(): combina iterables en paralelo

Actualizado el: 20/08/2026
Tempo de leitura: 4 minutos
Uso da função zip para combinar listas em Python

La función zip() de Python permite recorrer dos o más iterables al mismo tiempo y agrupar sus elementos por posición. Es una herramienta pequeña, pero aparece constantemente en scripts, análisis de datos, validaciones, transformación de listas y construcción de diccionarios. Cuando se usa bien, evita contadores manuales y hace que el código sea más legible.

Antes de profundizar, conviene dominar los bucles for en Python y la función enumerate(). Ambas se complementan con zip(), pero resuelven problemas diferentes.

Cómo funciona zip() en Python

zip() recibe varios iterables y devuelve un iterador de tuplas. Cada tupla contiene los elementos situados en la misma posición.

nombres = ["Ana", "Luis", "Marta"]
edades = [28, 34, 25]

for nombre, edad in zip(nombres, edades):
    print(f"{nombre} tiene {edad} años")

En la primera vuelta se agrupan "Ana" y 28; en la segunda, "Luis" y 34. El desempaquetado de la tupla permite asignar cada valor directamente a una variable.

Convertir el resultado en una lista

En Python 3, zip() devuelve un iterador, no una lista creada de inmediato. Esto ahorra memoria, especialmente con grandes volúmenes de información.

productos = ["Teclado", "Ratón", "Monitor"]
precios = [35.90, 18.50, 229.00]

pares = list(zip(productos, precios))
print(pares)

El resultado será una lista de tuplas. Convierte a lista únicamente cuando necesites reutilizar, indexar o mostrar todos los pares. Si solo vas a recorrerlos una vez, utiliza el iterador directamente.

Qué ocurre con listas de diferente longitud

Por defecto, zip() se detiene cuando termina el iterable más corto.

usuarios = ["ana", "carlos", "lucia"]
roles = ["admin", "editor"]

print(list(zip(usuarios, roles)))

El usuario lucia no aparecerá. Este comportamiento puede ocultar errores cuando esperas que ambas colecciones tengan la misma cantidad de elementos. En versiones modernas de Python puedes usar strict=True:

for usuario, rol in zip(usuarios, roles, strict=True):
    print(usuario, rol)

Si las longitudes son distintas, Python genera ValueError. Es una opción recomendable en procesos donde perder datos silenciosamente sería peligroso.

Completar valores con zip_longest

Cuando necesitas conservar todos los elementos, utiliza zip_longest() del módulo itertools.

from itertools import zip_longest

usuarios = ["ana", "carlos", "lucia"]
roles = ["admin", "editor"]

for usuario, rol in zip_longest(usuarios, roles, fillvalue="sin rol"):
    print(usuario, rol)

La guía de itertools en Python presenta otras herramientas eficientes para trabajar con iteradores sin construir listas innecesarias.

Crear diccionarios con zip()

Una aplicación muy común consiste en combinar una lista de claves con una lista de valores.

campos = ["nombre", "email", "activo"]
datos = ["Laura", "laura@example.com", True]

usuario = dict(zip(campos, datos, strict=True))
print(usuario)

Este patrón resulta útil al transformar filas de archivos CSV, respuestas de bases de datos o resultados procedentes de una API.

Recorrer tres o más iterables

zip() no está limitado a dos colecciones.

productos = ["A", "B", "C"]
precios = [10, 15, 12]
stock = [5, 0, 8]

for producto, precio, cantidad in zip(productos, precios, stock, strict=True):
    print(producto, precio, cantidad)

Este enfoque suele ser más claro que acceder a cada lista mediante índices, aunque conviene preguntarse si los datos deberían estar representados por diccionarios, dataclasses o registros con nombres explícitos.

Descomprimir valores con el operador *

También puedes invertir una colección de pares.

coordenadas = [(10, 20), (30, 40), (50, 60)]

valores_x, valores_y = zip(*coordenadas)
print(valores_x)
print(valores_y)

El operador * desempaqueta la lista y entrega cada tupla como argumento independiente a zip(). El resultado vuelve a agrupar todos los primeros elementos y todos los segundos.

Usar zip() con enumerate()

Si además necesitas un índice, combina ambas funciones.

nombres = ["Ana", "Luis", "Marta"]
puntos = [92, 84, 97]

for posicion, (nombre, puntos) in enumerate(zip(nombres, puntos), start=1):
    print(posicion, nombre, puntos)

La posición procede de enumerate(), mientras que los datos relacionados se agrupan con zip().

Transformaciones con comprensiones

zip() también funciona dentro de comprensiones de listas.

cantidades = [2, 3, 1]
precios = [10.0, 4.5, 25.0]

totales = [cantidad * precio for cantidad, precio in zip(cantidades, precios, strict=True)]
print(totales)

La expresión es compacta, pero no debería ocultar reglas empresariales complejas. Cuando la transformación incluye varias validaciones, una función con nombre suele ser más fácil de probar.

Ordenar datos relacionados

Para ordenar una colección principal y mantener sus datos asociados, puedes agrupar temporalmente los valores.

nombres = ["Marta", "Ana", "Luis"]
puntos = [97, 92, 84]

ordenados = sorted(zip(puntos, nombres), reverse=True)
for puntos, nombre in ordenados:
    print(nombre, puntos)

Consulta también la comparación entre sort() y sorted() para comprender cuándo se modifica una lista y cuándo se crea un nuevo resultado.

Errores frecuentes

Un error común es reutilizar el mismo objeto zip después de haberlo consumido. Como es un iterador, la segunda vuelta ya no contiene elementos. Otro problema es ignorar listas desiguales y perder datos sin advertencia. Usa strict=True cuando la igualdad de longitudes forme parte de la lógica.

También evita convertir automáticamente todo a lista. La evaluación perezosa es precisamente una de las ventajas de zip(). Por último, no agrupes colecciones que solo coinciden por accidente: si los elementos pueden desalinearse, utiliza identificadores y diccionarios en lugar de posiciones.

Documentación y referencias

La documentación oficial de zip() explica el parámetro strict, la evaluación perezosa y el comportamiento con múltiples iterables. Para completar colecciones de diferente longitud, consulta la documentación oficial de itertools.zip_longest().

Conclusión

zip() es ideal para recorrer datos relacionados, construir diccionarios, combinar columnas y transformar colecciones sin utilizar índices manuales. Utiliza strict=True para detectar diferencias inesperadas y zip_longest() cuando debas conservar todos los valores. La clave es usarlo cuando la relación por posición sea real, explícita y segura.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    notebook com código saindo da tela
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Variables: asignación, tipos y alcance en Python

    Aprende variables en Python: asignación, nombres, tipos, conversiones, referencias, mutabilidad, alcance, constantes, None y errores frecuentes.

    Ler mais

    Tempo de leitura: 4 minutos
    12/07/2026
    Diferença entre operadores is e == em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    == vs is en Python: igualdad vs identidad

    Entiende la diferencia entre == e is en Python, igualdad, identidad, None, interning, copias superficiales, deepcopy y objetos personalizados.

    Ler mais

    Tempo de leitura: 4 minutos
    12/07/2026
    Menu interativo no terminal criado com Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Menú interactivo en terminal con Python

    Crea un menú interactivo en Python con while, funciones, diccionarios, validación, submenús, persistencia JSON y manejo seguro de errores.

    Ler mais

    Tempo de leitura: 4 minutos
    12/07/2026
    ícone de loop com o texto 'While' abaixo
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    while: repite acciones con condiciones en Python

    Aprende bucles while en Python con condiciones, validación, menús, break, continue, else, centinelas, reintentos y buenas prácticas.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Imagem de um quadro negro com várias interrogações no lugar de lâmpadas, e uma lâmpada conectada no meio
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    if, elif y else: lógica condicional en Python

    Aprende if, elif y else en Python con comparaciones, operadores lógicos, validación, rangos, menús, retornos tempranos y pruebas.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026
    Manipulação de dados JSON em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    JSON en Python: leer, escribir y validar datos

    Aprende JSON en Python con load, loads, dump, dumps, archivos UTF-8, validación, APIs, Decimal, fechas y escritura segura.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026