Como usar a função zip() em Python (combinar iteráveis)

Aprenda como usar a função zip() do Python para combinar vários iteráveis em paralelo. Domine criações de dicionário, descompacte lógica e lide com incompatibilidades de comprimento.

Experimente esta solução no Editor

Visão geral

Ao iterar conjuntos de dados, muitas vezes você precisará processar várias listas relacionadas em paralelo. Por exemplo, emparelhar uma lista de nomes de usuários com uma lista de IDs de usuários ou combinar coordenadas de valores X e Y. Em vez de loops aninhados ou acessar itens usando contadores de indexação de lista, Python fornece a elegante função `zip()`.

A função `zip(*iterables)` pega vários iteráveis como argumentos e os agrega, retornando um iterador de tuplas onde a i-ésima tupla contém o i-ésimo elemento de cada um dos iteráveis de entrada. Isso permite que você percorra facilmente duas ou mais coleções simultaneamente com um único loop `for`.

Por padrão, `zip()` para de combinar quando o iterável de entrada mais curto se esgota. Quaisquer elementos restantes nos iteráveis ​​mais longos são descartados. Se você deseja emparelhar elementos até que o iterável mais longo se esgote, preenchendo os valores ausentes com um espaço reservado, o Python fornece `zip_longest()` no módulo `itertools` da biblioteca padrão.

Saída de código e execução

Este script demonstra a iteração de lista paralela, criando um dicionário usando zip e lidando com incompatibilidades usando zip_longest.

zip_function.py
Experimente no 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)
Saída 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')]

Implementação passo a passo

  • Passe as múltiplas listas ou iteráveis que deseja combinar para a função zip().
  • Descompacte as tuplas geradas em uma instrução de loop for para iterações paralelas limpas.
  • Converta o objeto zip em um dicionário usando dict(zip(keys_list,values_list)) para mapeamento.
  • Importe itertools.zip_longest para combinar listas de comprimentos desiguais sem perder valores finais.

Perguntas frequentes

Como faço para "descompactar" uma sequência compactada de tuplas?

Você pode descompactar uma sequência de volta em listas separadas usando o operador de descompactação *: list(zip(*zipped_tuples)).

Zip() duplica os elementos na memória?

Não, zip() retorna um iterador que produz elementos sob demanda, tornando-o extremamente eficiente em termos de memória.

Tópicos Relacionados

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.