zip python

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 : namese ages.

  • A namestupla armazena uma lista de nomes.
  • A agetupla 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 namese agesforem 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 namese :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 à employeevariável. A tupla contém os i-ésimos elementos as namese agestuplas.

zip python

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 forloop
  • Chamando a next()função
  • Envolvendo em umlist()

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 zip()função podem ter tamanhos diferentes. O zip()tem três estratégias diferentes para lidar com esse problema.

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 25Linguagem 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=Trueopção. Nesse caso, se os tamanhos dos iteráveis ​​forem diferentes, o zip()irá gerar um ValueError.

Observe que o strictargumento está disponível desde Python 3.10

Por exemplo, o seguinte irá gerar uma ValueErrorexceçã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 1Linguagem 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 itertoolsmó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 NoneLinguagem 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.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *