Cómo utilizar la función zip() en Python (Combinar iterables)

Aprenda a utilizar la función zip() de Python para combinar varios iterables en paralelo. Domine la creación de diccionarios, descomprima la lógica y maneje las discrepancias de longitud.

Pruebe esta solución en el Editor

Descripción general

Al iterar sobre conjuntos de datos, a menudo necesitará procesar varias listas relacionadas en paralelo. Por ejemplo, emparejar una lista de nombres de usuario con una lista de ID de usuario o hacer coincidir las coordenadas de los valores X e Y. En lugar de bucles anidados o acceder a elementos utilizando contadores de indexación de listas, Python proporciona la elegante función `zip()`.

La función `zip(*iterables)` toma múltiples iterables como argumentos y los agrega, devolviendo un iterador de tuplas donde la i-ésima tupla contiene el i-ésimo elemento de cada uno de los iterables de entrada. Esto le permite recorrer fácilmente dos o más colecciones simultáneamente con un único bucle "for".

De forma predeterminada, `zip()` deja de combinarse cuando se agota el iterable de entrada más corto. Cualquier elemento restante en los iterables más largos se descarta. Si desea emparejar elementos hasta que se agote el iterable más largo, completando los valores faltantes con un marcador de posición, Python proporciona `zip_longest()` en el módulo `itertools` de la biblioteca estándar.

Código y salida de ejecución

Este script demuestra la iteración de listas paralelas, la creación de un diccionario usando zip y el manejo de discrepancias usando zip_longest.

zip_function.py
Pruébelo en el editor
from itertools import zip_longest

names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 95]

# 1. Basic Zipping in a loop
print("--- Parallel Iteration ---")
for name, score in zip(names, scores):
    print(f"{name} scored {score}")

# 2. Creating a dictionary from two lists
user_dict = dict(zip(names, scores))
print("\nCreated Dictionary:", user_dict)

# 3. Handling unequal list lengths with zip_longest
extra_names = ["Alice", "Bob", "Charlie", "David"]
short_scores = [85, 90]

# Standard zip truncates
print("\nStandard zip output:", list(zip(extra_names, short_scores)))

# zip_longest fills missing values
zipped_long = list(zip_longest(extra_names, short_scores, fillvalue="N/A"))
print("zip_longest output:", zipped_long)
Salida terminal
--- Parallel Iteration ---
Alice scored 85
Bob scored 90
Charlie scored 95

Created Dictionary: {'Alice': 85, 'Bob': 90, 'Charlie': 95}

Standard zip output: [('Alice', 85), ('Bob', 90)]
zip_longest output: [('Alice', 85), ('Bob', 90), ('Charlie', 'N/A'), ('David', 'N/A')]

Implementación paso a paso

  • Pase las múltiples listas o iterables que desea combinar a la función zip().
  • Desempaquete las tuplas generadas en una declaración de bucle for para realizar iteraciones paralelas limpias.
  • Convierta el objeto zip en un diccionario usando dict(zip(keys_list, value_list)) para mapear.
  • Importe itertools.zip_longest para combinar listas de longitudes desiguales sin perder los valores finales.

Preguntas frecuentes

¿Cómo "descomprimo" una secuencia comprimida de tuplas?

Puede descomprimir una secuencia nuevamente en listas separadas usando el operador de descompresión *: list(zip(*zipped_tuples)).

¿Zip() duplica los elementos en la memoria?

No, zip() devuelve un iterador que genera elementos bajo demanda, lo que lo hace extremadamente eficiente en memoria.

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.