Quem vem de outras linguagens costuma escrever laços assim em Python:
frutas = ["maçã", "uva", "banana"]
for i in range(len(frutas)):
print(i, frutas[i])
Funciona, mas o Python tem ferramentas feitas exatamente para isso.
enumerate: índice e valor juntos
for i, fruta in enumerate(frutas):
print(i, fruta)
0 maçã
1 uva
2 banana
Quer começar a contar do 1? Use o parâmetro start:
for posicao, fruta in enumerate(frutas, start=1):
print(f"{posicao}º lugar: {fruta}")
zip: percorrendo várias listas ao mesmo tempo
nomes = ["Ana", "Bruno", "Carla"]
notas = [9.5, 7.0, 8.5]
for nome, nota in zip(nomes, notas):
print(f"{nome}: {nota}")
O zip "costura" as listas, pegando um item de cada por vez.
Criando dicionários com zip
boletim = dict(zip(nomes, notas))
print(boletim) # {'Ana': 9.5, 'Bruno': 7.0, 'Carla': 8.5}
Cuidado com listas de tamanhos diferentes
Por padrão, o zip para na lista mais curta e ignora o resto sem avisar. A partir do Python 3.10 dá para pedir que ele reclame:
nomes = ["Ana", "Bruno", "Carla"]
notas = [9.5, 7.0]
list(zip(nomes, notas)) # [('Ana', 9.5), ('Bruno', 7.0)]
list(zip(nomes, notas, strict=True)) # ValueError
Combinando os dois
for i, (nome, nota) in enumerate(zip(nomes, notas), start=1):
print(f"{i}. {nome} tirou {nota}")
Dica final
Sempre que escrever range(len(...)), pare e pense: provavelmente um enumerate ou um zip resolve de forma mais clara.
Contribua com novos artigos no nosso repositório.