Historia de la pregunta
La función zip() apareció en Python como una forma conveniente de "coser" varias secuencias en tuplas con elementos correspondientes, obteniendo así una especie de estructura "matricial".
Problema
Se produce un error cuando los desarrolladores utilizan zip para secuencias de diferentes longitudes, esperando que el resultado sea de la longitud de la más larga, o utilizan incorrectamente el desempaquetado al revertir la transformación.
Solución
zip() toma una o varias secuencias y devuelve un iterador de tuplas, donde la n-ésima tupla contiene los n-ésimos elementos de todas las secuencias. La iteración termina cuando se agota la secuencia más corta.
Código de ejemplo:
names = ['John', 'Anna', 'Peter'] ages = [28, 22, 35] grouped = list(zip(names, ages)) print(grouped) # [('John', 28), ('Anna', 22), ('Peter', 35)]
Características clave:
¿Qué sucederá si se pasan secuencias de diferentes longitudes a zip?
El resultado tendrá la longitud de la secuencia más corta. Los otros elementos serán ignorados.
zip([1,2,3], ['a','b']) # [(1,'a'), (2,'b')]
¿Se puede "desenvolver" zip? ¿Cómo se pueden recuperar las secuencias originales?
Sí, utilizando el operador de desempaquetado y zip(*iterator):
pairs = [(1, "a"), (2, "b")] numbers, letters = zip(*pairs) print(numbers) # (1, 2)
¿Cuál es la diferencia entre zip y itertools.zip_longest?
zip_longest de itertools trabaja hasta la secuencia más larga, rellenando los espacios con el fillvalue especificado.
from itertools import zip_longest zip_longest([1,2], ['a','b','c'], fillvalue=None) # [(1,'a'), (2,'b'), (None, 'c')]
Procesamos pares de usuarios y contraseñas mediante zip, pero las listas resultaron ser de diferente longitud. Varios usuarios no fueron considerados debido a que zip trabajó con la lista más corta.
Pros:
Contras:
Para combinar los resultados del examen y los nombres de los estudiantes utilizamos zip_longest con fillvalue="n/a", manteniendo los datos de todos los participantes.
Pros:
Contras: