Sobre a função Zip
Como afirmado anteriormente, a função "zip" é usada para criar pares de elementos de vários objetos iteráveis. Considere o exemplo abaixo para entender a sintaxe básica e o uso da função zip:
lista1 = ["a", "b", "c"]lista2 = ["maçã", "bola", "gato"]
compactado = zip (lista1, lista2)
imprimir (lista (zipada))
As primeiras duas instruções no exemplo de código acima definem duas listas contendo alguns elementos. Em seguida, a função “zip” é usada passando as variáveis “lista1” e “lista2” como argumentos. Esta é a sintaxe principal da função “zip”. Você só precisa passar listas ou outros iteráveis ordenados válidos como argumentos cujos elementos você deseja combinar. Por último, a instrução de impressão é usada para obter a saída da variável “compactada”. Depois de executar o exemplo de código mencionado acima, você deve obter a seguinte saída:
[('a', 'maçã'), ('b', 'bola'), ('c', 'gato')]Observe que a função “zip” retorna um objeto do tipo “zip” e não uma lista. Você deve convertê-lo para um tipo iterável, como mostrado na instrução de impressão acima.
Em termos simples, a função “zip” pega elementos do mesmo índice de duas listas e os combina como um par em uma tupla. Assim, o 0º elemento da “lista1” é combinado com o 0º elemento da “lista2”, o 1º elemento da “lista1” é combinado com o 1º elemento da “lista2” e assim por diante. A função Zip move-se da esquerda para a direita e a tupla contendo elementos emparelhados tem o mesmo índice que os elementos armazenados neles.
Usando Zip quando os iteráveis não têm o mesmo número de elementos
No exemplo mencionado acima, ambas as listas têm o mesmo número de elementos. Caso você esteja lidando com algum código onde ambas as listas não possuem o mesmo número de elementos, a função “zip” irá parar no último elemento da lista com o menor número de elementos.
No exemplo abaixo, a função “zip” irá parar no elemento “c”, independentemente de “list2” ter mais um elemento.
lista1 = ["a", "b", "c"]list2 = ["maçã", "bola", "gato", "boneca"]
compactado = zip (lista1, lista2)
imprimir (lista (zipada))
Depois de executar o exemplo de código mencionado acima, você deve obter a seguinte saída:
[('a', 'maçã'), ('b', 'bola'), ('c', 'gato')]Você pode usar mais de dois iteráveis ao usar a função Zip
Normalmente, a função “zip” é usada para comparar dois objetos iteráveis. No entanto, você pode passar qualquer número de iteráveis como argumentos para a função “zip”. O princípio de parar no último elemento da lista mais curta ainda será aplicável.
lista1 = ["a", "b", "c"]list2 = ["maçã", "bola", "gato", "boneca"]
list3 = ["5", "3"]
compactado = zip (lista1, lista2, lista3)
imprimir (lista (zipada))
Depois de executar o exemplo de código mencionado acima, você deve obter a seguinte saída como resultado:
[('a', 'maçã', '5'), ('b', 'bola', '3')]Criação de listas individuais a partir de um objeto do tipo Zip
Se você já tem um objeto "zip", pode usá-lo para preencher novamente listas individuais que foram usadas anteriormente quando a função zip foi chamada pela primeira vez nelas.
lista1 = ["a", "b", "c"]list2 = ["maçã", "bola", "gato", "boneca"]
list3 = ["5", "3"]
compactado = zip (lista1, lista2, lista3)
l1, l2, l3 = zip (* zipado)
imprimir (lista (l1), lista (l2), lista (l3))
Depois de executar o exemplo de código mencionado acima, você deve obter a seguinte saída como resultado:
['a', 'b'] ['maçã', 'bola'] ['5', '3']No exemplo de código acima, o objeto “zip” é esvaziado usando o operador “*”. Os resultados deflacionados são então alimentados em outra chamada para a função zip que cria listas originais. Observe que você não pode obter todos os elementos de volta nas listas originais se listas de comprimento desigual foram usadas quando o objeto "zip" foi criado pela primeira vez.
Usando o Zip quando você quiser manter os elementos da iteração mais longa
Em vários exemplos acima, você pode ter observado que a função "zip" por padrão para no último elemento do iterável mais curto. E se você quiser que ele continue iterando até atingir o último elemento do iterável mais longo?
Nesse caso, você terá que usar o método “zip_longest ()” do módulo “itertools” do Python. Funciona da mesma forma que a função “zip”, com uma pequena diferença que para no último elemento do tipo iterável mais longo.
from itertools import zip_longestlista1 = ["a", "b", "c"]
list2 = ["maçã", "bola", "gato", "boneca"]
list3 = ["5", "3"]
compactado = zip_longest (lista1, lista2, lista3)
imprimir (lista (zipada))
Depois de executar o exemplo de código mencionado acima, você deve obter a seguinte saída como resultado:
[('a', 'maçã', '5'), ('b', 'bola', '3'), ('c', 'gato', Nenhum), (Nenhum, 'boneca', Nenhum) ]Os valores ausentes são preenchidos como objetos do tipo “Nenhum”. Você também pode fornecer seu próprio valor para preencher passando um argumento "fillvalue" extra para o método "zip_longest".
from itertools import zip_longestlista1 = ["a", "b", "c"]
list2 = ["maçã", "bola", "gato", "boneca"]
list3 = ["5", "3"]
compactado = zip_longest (lista1, lista2, lista3, fillvalue = "my_value")
imprimir (lista (zipada))
Depois de executar o exemplo de código mencionado acima, você deve obter a seguinte saída como resultado:
[('a', 'maçã', '5'), ('b', 'bola', '3'), ('c', 'gato', 'meu_valor'), ('meu_valor', 'boneca ',' meu_valor ')]Conclusão
A função Zip pode ser emulada usando alguns loops e declarações de condições. No entanto, ajuda a manter o código organizado e mais limpo, removendo verbosidade desnecessária e instruções repetitivas.