ProgramaciónDesarrollador Backend Python

Explique cómo funciona la función zip() en Python, para qué se utiliza y qué aspectos se deben tener en cuenta al trabajar con secuencias de diferentes longitudes.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Devuelve un iterador perezoso, no crea una lista en memoria completa.
  • La iteración continúa hasta la secuencia más corta.
  • Permite "desenvolver" fácilmente los datos de vuelta mediante desempaquetado y zip(*...)

Preguntas trampa.

¿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')]

Errores típicos y anti-patrones

  • Esperar que zip cree pares de la longitud máxima.
  • Comportamiento no evidente con secuencias vacías: zip está vacío inmediatamente.
  • Usar zip sin convertir a lista en Python 3: zip es un iterador y puede agotarse después de ser recorrido.

Ejemplo de la vida real

Caso negativo

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:

  • Código conciso.

Contras:

  • Pérdida de información.
  • Difícil de depurar cuando la razón de la pérdida de datos no es evidente.

Caso positivo

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:

  • Se ven claramente los espacios vacíos.
  • Nadie se perdió en el procesamiento.

Contras:

  • Necesita importar un módulo adicional.