Fonte: Minha postagem no blog (melhor formatação)
Exemplo
numbers = [1,2,3]
letters = 'abcd'
zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]
Entrada
Zero ou mais iteráveis [1] (por exemplo, lista, string, tupla, dicionário)
Saída (lista)
1a tupla = (elemento_1 de números, elemento_1 de letras)
2a tupla = (e_2 números, e_2 letras)
...
n-ésima tupla = (números e_n, letras e_n)
- Lista de n tuplas: n é o comprimento do argumento mais curto (entrada)
- len (números) == 3 <len (letras) == 4 → curto = 3 → retornar 3 tuplas
- Comprimento de cada tupla = # de args (tupla recebe um elemento de cada arg)
- args = (números, letras); len (args) == 2 → tupla com 2 elementos
i
tupla = (elemento_i arg1, elemento_i arg2…, elemento_i arg n
)
Casos Edge
1) String vazia: len (str) = 0 = sem tuplas
2) String única: len (str) == 2 tuplas com len (args) == 1 elemento (s)
zip()
# []
zip('')
# []
zip('hi')
# [('h',), ('i',)]
Zip em ação!
1. Crie um dicionário [2] de duas listas
keys = ["drink","band","food"]
values = ["La Croix", "Daft Punk", "Sushi"]
my_favorite = dict( zip(keys, values) )
my_favorite["drink"]
# 'La Croix'
my_faves = dict()
for i in range(len(keys)):
my_faves[keys[i]] = values[i]
zip
é uma solução elegante, clara e concisa
2. Imprimir colunas em uma tabela
"*" [3] é chamado "desembalar": f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
student_grades = [
[ 'Morty' , 1 , "B" ],
[ 'Rick' , 4 , "A" ],
[ 'Jerry' , 3 , "M" ],
[ 'Kramer' , 0 , "F" ],
]
row_1 = student_grades[0]
print row_1
# ['Morty', 1, 'B']
columns = zip(*student_grades)
names = columns[0]
print names
# ('Morty', 'Rick', 'Jerry', 'Kramer')
Crédito Extra: Descompactando
zip(*args)
é chamado de "descompactar" porque tem o efeito inverso de zip
numbers = (1,2,3)
letters = ('a','b','c')
zipped = zip(numbers, letters)
print zipped
# [(1, 'a'), (2, 'b'), (3, 'c')]
unzipped = zip(*zipped)
print unzipped
# [(1, 2, 3), ('a', 'b', 'c')]
unzipped
: tuple_1 = e1 de cada tupla compactada. tuple_2 = e2 de cadazipped
Notas de rodapé
- Um objeto capaz de retornar seus membros um de cada vez (ex. Lista [1,2,3], string 'eu gosto de codin', tupla (1,2,3), dicionário {'a': 1, 'b' : 2})
- {chave1: valor1, chave2: valor2 ...}
- "Desembalar" (*)
*
Código:
# foo - function, returns sum of two arguments
def foo(x,y):
return x + y
print foo(3,4)
# 7
numbers = [1,2]
print foo(numbers)
# TypeError: foo() takes exactly 2 arguments (1 given)
print foo(*numbers)
# 3
*
pegou numbers
(1 arg) e descompactou seus '2 elementos em 2 args
zip
fazer? Por que você deveria ter três listas - como elas seriam?