zip() en Python: combina listas e iterables correctamente

Publicado el: 11/07/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", "[email protected]", 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

    Geração de números aleatórios seguros usando secrets em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Módulo secrets en Python: números y tokens seguros

    Aprende secrets en Python para generar contraseñas, códigos y tokens seguros con randbelow, choice, token_hex, token_urlsafe y compare_digest.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Uso do operador walrus para atribuições inline em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Operador walrus en Python: guía con ejemplos

    Aprende el operador walrus := en Python: condiciones, while, comprensiones, lectura por bloques, regex, alcance y buenas prácticas.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Uso do módulo time para controlar tempo em scripts Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Módulo time en Python: pausas, timestamps y rendimiento

    Aprende el módulo time en Python: timestamps, sleep, monotonic, perf_counter, struct_time, strftime y buenas prácticas para medir tiempo.

    Ler mais

    Tempo de leitura: 5 minutos
    11/07/2026
    Introdução ao módulo sys para iniciantes em Python
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Módulo sys en Python: guía práctica para principiantes

    Aprende el módulo sys en Python: argv, exit, version, platform, path, flujos estándar, tamaño de objetos y buenas prácticas.

    Ler mais

    Tempo de leitura: 6 minutos
    11/07/2026
    Como converter código Python para C usando Cython
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Cython: cómo acelerar Python compilando a C

    Aprende Cython para acelerar Python: archivos .pyx, cdef, cpdef, tipos C, memoryviews, GIL, NumPy, compilación y benchmarks.

    Ler mais

    Tempo de leitura: 6 minutos
    11/07/2026
    Uso do operador ternário em Python para condições rápidas
    Fundamentos
    Foto de perfil de Leandro Hirt da Academify

    Operador ternario en Python: guía clara y práctica

    Aprende el operador ternario en Python: sintaxis, asignaciones, listas, return, anidación, errores frecuentes y buenas prácticas.

    Ler mais

    Tempo de leitura: 4 minutos
    11/07/2026