Função zip em Python

zipper

Aviso aos navegantes: a função zip, apesar do seu nome, não serve para zipar um arquivo. Se estiver procurando por isso, veja o módulo zipfile.


Escreva em Python uma função que, dadas duas listas não vazias e de mesmo comprimento, retorne como resultado uma nova lista contendo em cada posição a soma dos elementos correspondentes nas duas listas recebidas. Exemplo:

def soma_listas(l1, l2):
    # seu código aqui
    # ...
    return l3

l1 = [1, 2, 3]
l2 = [4, 5, 6]
print soma_listas(l1, l2) # deve imprimir [5, 7, 9]

Uma ideia que pode surgir é:

def soma_listas(l1, l2):
    l3 = []
    for i in range(0, len(l1)):
        l3.append(l1[i] + l2[i])
    return l3

Isso para quem ainda não conhece a função builtin zip. A documentação da função diz (tradução própria):

Esta função retorna uma lista de tuplas, onde a i-ésima tupla contém o i-ésimo elemento de cada um dos argumentos.

O exemplo usado na documentação oficial é bem claro:

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> print zip(x, y)
[(1, 4), (2, 5), (3, 6)]

O que a função fez foi: para cada elemento da lista x, juntou o elemento correspondente em posição da lista y a ele em uma tupla e a adicionou a uma lista.


[ 1, 2, 3 ]
-zip--------------- ====> [(1, 4), (2, 5), (3, 6)]
[ 4, 5, 6 ]

Sacou por que o post inicia com a imagem de um zíper?

Isso é particularmente útil quando precisarmos percorrer duas sequências de elementos em paralelo. A função soma_listas, usando zip, fica:

def soma_listas(l1, l2):
    l3 = []
    for x in zip(l1, l2):
        l3.append(x[0]+x[1])
    return l3

Ou então, usando list comprehensions:

def soma_listas(l1, l2):
    return [x[0]+x[1] for x in zip(l1, l2)]

Para finalizar, vamos escrever agora uma funçãozinha que receba duas listas como entrada e retorne como resultado uma nova lista contendo, em cada posição, o maior valor da posição correspondente nas duas listas. Por exemplo:

maiores([1, 2, 9], [2, 1, 7]) -> [2, 2, 9]

Com a função zip, fica barbada:

def maiores(l1, l2):
    l3 = []
    for x, y in zip(l1, l2):
        l3.append(x if x > y else y)
    return l3

Como a função zip retorna uma lista de tuplas de 2 valores, podemos desempacotar essas tuplas diretamente em x e y no próprio for, assim como fizemos no código acima. (for x, y in zip(l1, l2))

Obs.: Caso não tenha entendido o código l3.append(x if x > y else y), leia também o post “Seleção Condicional de Valores”.

12 comentários sobre “Função zip em Python

  1. Eu nunca via muitos bons exemplos pra explicar o 3o argumento do slice, exceto o uso de -1 pra acessar a lista invertida. Esse é um bom exemplo de uso desse argumento, simples e fácil de entender. Valeu pela dica e pelo excelente artigo!

  2. Pingback: Brincando com Listas | Python Help

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s