Resumo : neste tutorial, você aprenderá como usar a zip()
função Python para realizar iterações paralelas em vários iteráveis.
Introdução à função zip() do Python
Suponha que você tenha duas tuplas : names
e ages
.
- A
names
tupla armazena uma lista de nomes. - A
age
tupla armazena uma lista de idades.
Para mapear nomes e idades dessas tuplas, um por um, em sequência, você pode usar a enumerate()
função. Por exemplo:
names = ('John', 'Jane', 'Alice')
ages = (20, 22, 25)
for index, name in enumerate(names):
print((name, ages[index]))
Linguagem de código: Python ( python )
Saída:
('John', 20)
('Jane', 22)
('Alice', 25)
Linguagem de código: Python ( python )
Então John tem 20 anos, Jane tem 22 e Alice tem 25
No entanto, fica mais complicado se os tamanhos das tuplas names
e ages
forem diferentes. É por isso que a zip()
função entra em ação.
O seguinte mostra a sintaxe da zip()
função:
zip(*iterables, strict=False)
Linguagem de código: Python ( python )
A zip()
função itera vários iteráveis em paralelo e retorna as tuplas que contêm elementos de cada iterável.
Em outras palavras, a zip()
função retorna um iterador de tuplas onde a i-ésima tupla contém o i-ésimo elemento de cada iterável de entrada.
O exemplo a seguir mostra como usar a zip()
função para iterar sobre as tuplas names
e :ages
names = ('John', 'Jane', 'Alice')
ages = (20, 22, 25)
for employee in zip(names, ages):
print(employee)
Linguagem de código: Python ( python )
Saída:
('John', 20)
('Jane', 22)
('Alice', 25)
Linguagem de código: Python ( python )
Neste exemplo, zip()
retorna uma tupla em cada iteração e a atribui à employee
variável. A tupla contém os i-ésimos elementos as names
e ages
tuplas.
A zip()
função retorna um objeto zip que é um iterador:
names = ('John', 'Jane', 'Alice')
ages = (20, 22, 25)
employees = zip(names, ages)
print(type(employees)) # 👉 <class 'zip'>
Linguagem de código: Python ( python )
O zip()
é preguiçoso. Isso significa que o Python não processará os elementos até que você itere o iterável. Para iterar o iterável, você pode usar:
- Usando um
for
loop - Chamando a
next()
função - Envolvendo em um
list()
Por exemplo:
names = ('John', 'Jane', 'Alice')
ages = (20, 22, 25)
employees = zip(names, ages)
employee_list = list(employees)
print(employee_list) # 👉 [('John', 20), ('Jane', 22), ('Alice', 25)]
Linguagem de código: Python ( python )
Iteráveis com tamanhos diferentes
Os iteráveis passados para a
função podem ter tamanhos diferentes. O zip()
tem três estratégias diferentes para lidar com esse problema.zip()
Por padrão, o zip()
irá parar quando concluir a iteração do iterável mais curto. Irá ignorar os itens restantes nos iteráveis mais longos. Por exemplo:
names = ('John', 'Jane', 'Alice', 'Peter')
ages = (20, 22, 25)
for name, age in zip(names, ages):
print(name, age)
Linguagem de código: Python ( python )
Saída:
John 20
Jane 22
Alice 25
Linguagem de código: Python ( python )
Neste exemplo, a zip()
função executa três iterações com base no menor tamanho dos nomes e idades.
Se quiser garantir que os iteráveis tenham os mesmos tamanhos, você pode usar a strict=True
opção. Nesse caso, se os tamanhos dos iteráveis forem diferentes, o zip()
irá gerar um ValueError
.
Observe que o strict
argumento está disponível desde Python 3.10
Por exemplo, o seguinte irá gerar uma ValueError
exceção porque os tamanhos dos iteráveis são diferentes:
names = ('John', 'Jane', 'Alice', 'Peter')
ages = (20, 22, 25)
for name, age in zip(names, ages, strict=True): # ValueError 🛑
print(name, age)
Linguagem de código: Python ( python )
Saída:
ValueError: zip() argument 2 is shorter than argument 1
Linguagem de código: Python ( python )
Se os iteráveis forem de tamanho desigual e você quiser preencher os valores ausentes com um fillvalue
, você pode usar a zip_longest()
função do itertools
módulo:
itertools.zip_longest(*iterables, fillvalue=None)
Linguagem de código: Python ( python )
Por padrão, fillvalue
é Nenhum. Por exemplo:
from itertools import zip_longest
names = ('John', 'Jane', 'Alice', 'Peter')
ages = (20, 22, 25)
for name, age in zip_longest(names, ages):
print(name, age)
Linguagem de código: Python ( python )
Saída:
John 20
Jane 22
Alice 25
Peter None
Linguagem de código: Python ( python )
Descompacte um iterável usando a função Python zip()
A descompactação reverte a compactação, convertendo os valores compactados de volta em valores individuais. Para descompactar, você usa a função zip() com o operador de descompactação ( *
). Por exemplo:
employees = (('John', 20), ('Jane', 22), ('Alice', 25))
names, ages = zip(*employees)
print(names)
print(ages)
Linguagem de código: Python ( python )
Saída:
('John', 'Jane', 'Alice')
(20, 22, 25)
Linguagem de código: Python ( python )
Neste exemplo, temos uma tupla onde cada elemento contém um nome e uma idade. A zip()
função descompacta a tupla para criar duas tuplas diferentes (nomes e idades).
Resumo
- Use a
zip()
função para iterar iteráveis em paralelo. - Use a
zip()
função com o operador de descompactação (*
) para descompactar valores. - Use
itertool.zip_longest()
a função para compactar iteráveis de tamanhos diferentes.