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”.

Você precisa fazer login para comentar.