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”.
14 comentários sobre “Função zip em Python”
Deixe um comentário
Você precisa fazer o login para publicar um comentário.

Eu ja conhecia essa função. É realmente muito útil. muito bom.
Existe algo parecido com um unzip, pra separar os elementos de uma lista gerando duas novas listas?
Fala Marco!
Algo como pegar uma lista de tuplas e quebrar em duas listas? Ou separar uma lista qualquer, intercalando elementos?
Separar uma lista qualquer, intercalando elementos.
Então, builtin acho que não tem não. Dá pra fazer um slicing, definindo um passo de 2, iniciando a partir de 0 e a partir de 1, tipo:
>>> lista = [1,2,3,4,5,6,7,8]
>>> lista[::2], lista[1::2]
([1, 3, 5, 7], [2, 4, 6, 8])
Perfeito!
E no caso de uma lista de tuplas, como fazer para quebrar em duas listas?
Tem um jeito direto/ mais esperto?
nomes = []
for salario, nome in lista:
nomes.append(nome)
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!
Valeu, Marco!
Olá, eu gostaria de te sugerir um tópico sobre expressões regulares no Python. Valeu!
Opa, é um bom tópico! Vou colocá-lo na lista. 🙂
Valeu, Andreas!
l1, l2 e l3, com essa fonte ficou parecendo onze, doze e treze.