Trilha de aprendizado · Nível 3 · Tutorial 5

Percorrer sequências com enumerate e zip

Percorrer sequências mantendo a posição de cada elemento ou associando valores de sequências diferentes, sem gerenciar contadores manualmente.

  • Nível: Iniciante
  • Duração: 11 min
  • 6 passos
Percorrer sequências com enumerate e zip

Passo 1 de 6

Obter posição e valor com enumerate

Receba a posição e o elemento diretamente no for, sem criar nem atualizar um contador.

Dois valores em cada passagem

Quando você precisa da posição e do valor de cada elemento, use enumerate. Por padrão, ele produz pares com numeração a partir de zero.

No for, o par é desempacotado diretamente nas duas variáveis: a primeira recebe a posição; a segunda, o elemento.

Posição primeiro, elemento depois

Observe que não há contador para inicializar nem incrementar.

python
frutas = ["figo", "pera", "uva"]

for posicao, fruta in enumerate(frutas):
    print(posicao, fruta)
Três elementos da lista, figo, pera e uva, ligados respectivamente aos pares (0, figo), (1, pera) e (2, uva). Em cada par, a posição vem antes do elemento.

Cada coluna representa uma passagem do laço: a saída será 0 figo, depois 1 pera e depois 2 uva.

Complete o laço

Complete a lacuna usando numero para a posição e cor para o elemento. Escreva os dois nomes separados por vírgula.

cores = ["azul", "verde", "azul"]

for ___ in enumerate(cores):
    print(numero, cor)

Acompanhe uma passagem

Leia o código e preveja os valores antes de executá-lo. Se quiser conferir, use seu ambiente Python no computador.

python
cores = ["azul", "verde", "azul"]

for numero, cor in enumerate(cores):
    print(numero, cor)

Na terceira passagem do laço, quais valores as variáveis recebem?

Passo 2 de 6

Escolher onde a numeração começa

Use start para escolher a numeração de enumerate sem alterar os índices nem a ordem dos elementos.

Uma lista numerada a partir de 1

Para apresentar uma lista numerada a partir de 1, use start=1 em enumerate. O primeiro elemento recebe esse número, e a numeração aumenta de um em um.

python
nomes = ["Bia", "Caio", "Lia"]

for numero, nome in enumerate(nomes, start=1):
    print(numero, nome)

Exemplo

Saída

1 Bia
2 Caio
3 Lia

Preveja a nova numeração

No código anterior, se trocarmos apenas start=1 por start=7, qual será a saída?

Número de apresentação não é índice

start muda apenas a numeração produzida por enumerate: não pula elementos, não muda sua ordem e não modifica a lista. Bia continua no índice 0, mesmo quando recebe o número 7.

Comparação para a lista Bia, Caio e Lia: índices reais 0, 1 e 2; enumerate sem start produz 0, 1 e 2; com start=1 produz 1, 2 e 3; com start=7 produz 7, 8 e 9.

Leia cada coluna: o elemento e seu índice permanecem iguais; só a numeração muda.

Acesse o mesmo elemento

Na lista nomes = ["Bia", "Caio", "Lia"], Bia recebeu o número 7 em um percurso com start=7. Complete com o índice para acessar Bia diretamente: nomes[___].

Passo 3 de 6

Associar duas sequências com zip

Use zip para percorrer duas sequências e associar os valores que estão na mesma posição.

Uma posição, dois valores

Para associar valores de duas sequências, use zip. Ele forma pares por posição: primeiro com primeiro, segundo com segundo, e assim por diante.

Considere participantes = ["Ana", "Bia", "Caio"] e pontos = [8, 10, 6]. As duas listas têm três elementos.

Duas listas alinhadas por posição: Ana está ligada a 8, Bia a 10 e Caio a 6. As conexões são verticais, sem cruzamentos.

zip associa pela posição: não procura valores iguais nem reorganiza as listas.

Reconheça os pares

Em zip(["Ana", "Bia", "Caio"], [8, 10, 6]), associe cada participante aos seus pontos.

Toque em um item e depois no par correspondente.

Receba o par no for

Em for participante, pontuacao in zip(participantes, pontos), o primeiro destino recebe um valor da primeira sequência; o segundo recebe um valor da segunda.

Diferentemente de enumerate, zip não acrescenta uma numeração: os dois valores vêm das sequências fornecidas.

Participante e pontuação

python
participantes = ["Ana", "Bia", "Caio"]
pontos = [8, 10, 6]

for participante, pontuacao in zip(participantes, pontos):
    print(f"{participante}: {pontuacao} pontos")

Exemplo

Saída esperada

Ana: 8 pontos
Bia: 10 pontos
Caio: 6 pontos

A ordem na chamada importa

Agora as sequências aparecem na ordem inversa na chamada de zip.

python
participantes = ["Ana", "Bia", "Caio"]
pontos = [8, 10, 6]

for pontuacao, participante in zip(pontos, participantes):
    print(pontuacao, participante)

Qual será a primeira linha impressa?

Passo 4 de 6

Prever onde zip termina

Preveja quantos pares serão formados e quais valores ficarão fora do laço quando as sequências tiverem comprimentos diferentes.

O limite é a sequência mais curta

No uso padrão, zip para assim que uma das sequências termina. A quantidade de pares é igual ao menor dos dois comprimentos, não importa qual sequência venha primeiro na chamada.

Três nomes, duas notas

python
nomes = ["Ana", "Bia", "Caio"]
notas = [8, 6]

for nome, nota in zip(nomes, notas):
    print(nome, nota)
Ana se conecta à nota 8 e Bia à nota 6. Caio não tem nota correspondente e fica sem par.

A saída tem apenas duas linhas: Ana 8 e Bia 6. Caio não participa do laço, mas continua na lista nomes.

Atenção

Sem aviso automático

Nesse uso, zip não avisa que os comprimentos diferem. Os valores excedentes não entram no laço e não são removidos das listas originais.

E se a primeira sequência acabar antes?

python
nomes = ["Ana", "Bia"]
notas = [8, 6, 9, 7]

for nome, nota in zip(nomes, notas):
    print(nome, nota)

Preveja o percurso

Quantos pares serão formados? Quais notas não participarão do laço? Elas continuarão na lista original?

Escreva pelo menos 10 caracteres (0/10).

Uma sequência vazia: nenhum par

Se uma das sequências estiver vazia, o menor comprimento será zero. Não haverá nenhum par, e o corpo do for não será executado.

O laço não imprime nada

Ana e Bia continuam na lista, mas nenhum nome participa do laço.

python
nomes = ["Ana", "Bia"]
notas = []

for nome, nota in zip(nomes, notas):
    print(nome, nota)

Confira os três casos

Associe cada chamada ao número de pares e aos valores que não participarão do laço.

Toque em um item e depois no par correspondente.

Passo 5 de 6

Conferir comprimentos antes de associar

Use len e if para impedir um percurso parcial quando todos os elementos precisarem de correspondência.

Todos precisam de um par?

Se a tarefa aceita apenas os pares disponíveis, o encerramento padrão de zip pode servir. Mas, se cada produto precisa ter um preço, deixar elementos de fora não serve.

Nesse caso, compare os comprimentos antes do laço: só execute o percurso quando forem iguais.

Comparação de dois casos: duas sequências com três elementos cada permitem o percurso; sequências com três e dois elementos bloqueiam todo o percurso após a conferência.

Com essa conferência, comprimentos diferentes impedem o laço inteiro, não apenas o processamento do elemento excedente.

Conferir antes de percorrer

Um preço está faltando

O for fica dentro do if. Assim, ele só é executado quando a comparação é verdadeira.

python
produtos = ["Caderno", "Caneta", "Borracha"]
precos = [18, 4]

if len(produtos) == len(precos):
    for produto, preco in zip(produtos, precos):
        print(f"{produto}: R$ {preco}")
else:
    print("Confira os dados: as quantidades são diferentes.")

Exemplo

Resultado

Como os comprimentos são 3 e 2, aparece apenas:

Confira os dados: as quantidades são diferentes.

Nenhum produto é associado a um preço.

Dica

Mesmo tamanho não garante a ordem certa

A conferência garante apenas quantidades iguais. Se os preços estiverem em outra ordem, o teste ainda passa e zip associa cada produto ao preço na mesma posição. Confira também a ordem dos dados.

Monte o percurso protegido

Ordene os blocos para mostrar cada livro com seu número de páginas somente quando as quantidades forem iguais. Preserve a indentação mostrada.

  1. if len(livros) == len(paginas):
  2. else: print("Confira os dados: as quantidades são diferentes.")
  3. for livro, total in zip(livros, paginas): print(f"{livro}: {total} páginas")
  4. livros = ["O jardim", "A viagem"] paginas = [120, 85]

Passo 6 de 6

Aplicar e revisar: participantes e pontuações

Complete um relatório com participantes numerados e pontuações associadas, conferindo os comprimentos antes de usar zip.

Duas tarefas, duas ferramentas

Seu relatório terá dois percursos separados:

  • enumerate: apresentar os participantes com numeração a partir de 1.
  • zip: associar cada participante à pontuação na mesma posição, somente se os comprimentos forem iguais.

A numeração é de apresentação: o participante número 1 continua no índice 0.

Dois relatórios separados: à esquerda, 1 Ana, 2 Bia e 3 Caio; à direita, Ana com 8, Bia com 6 e Caio com 9. O primeiro associa um número ao nome; o segundo associa nome e pontuação.

À esquerda, número e elemento; à direita, elementos de duas listas associados pela posição.

Complete e execute no seu computador

Copie o código-base para seu editor e substitua os três ___:

  1. Uma chamada de enumerate para numerar participantes a partir de 1.
  2. Uma comparação de igualdade entre os comprimentos das listas.
  3. Uma chamada de zip, com participantes antes de pontuações.

Execute com Python 3. Depois, retire apenas o último valor de pontuacoes, deixando [8, 6], e execute novamente. Observe quais linhas continuam aparecendo.

Código-base para completar

Os espaços marcados com ___ precisam ser substituídos antes da execução.

python
participantes = ["Ana", "Bia", "Caio"]
pontuacoes = [8, 6, 9]

for numero, nome in ___:
    print(f"{numero}. {nome}")

if ___:
    for nome, pontos in ___:
        print(f"{nome}: {pontos} pontos")
else:
    print("Pontuações não exibidas: comprimentos diferentes.")

Dica

O que conferir

O primeiro percurso independe das pontuações. A condição protege apenas o segundo: neste relatório, não queremos mostrar associações parciais.

Compare as duas execuções

Relate as saídas das duas execuções. Por que enumerate atende à primeira tarefa e zip à segunda? Explique também por que Ana aparece com o número 1, embora esteja no índice 0, e o que impediu a exibição parcial das pontuações.

Escreva pelo menos 60 caracteres (0/60).

Critérios para levar com você

Resumo

Escolha e confira

  • Use enumerate quando precisar de número e elemento. A numeração começa em 0 por padrão; start escolhe outro início sem alterar índices ou pular elementos.
  • Use zip para associar elementos por posição. A ordem das sequências na chamada define a ordem dos valores recebidos.
  • O zip padrão termina na sequência mais curta, sem aviso. Se uma estiver vazia, não há pares; os excedentes permanecem nas listas originais.
  • Quando todos precisarem de correspondência, compare os comprimentos antes do percurso. Comprimentos iguais não garantem que os dados estejam na ordem correta.

Tutorial concluído

Parabéns! Você concluiu: Percorrer sequências com enumerate e zip

Você chegou ao fim de Percorrer sequências com enumerate e zip. Agora pode numerar elementos e associar duas sequências, reconhecendo quando conferir os comprimentos para evitar um relatório parcial.

Baixe o Aplicativo agora para ter acesso a + de 5000 cursos gratuitos, exercícios, certificado e muito conteúdo sem pagar nada!

  • Cursos online 100% gratuitos do início ao fim

    Milhares de cursos online em vídeo, ebooks e áudiobooks.

  • Mais de 60 mil exercícios gratuitos

    Para testar seus conhecimentos no decorrer dos cursos online

  • Certificado Digital gratuito válido em todo o Brasil

    Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail

Aplicativo Cursa na tela de ebook, na tela de curso em vídeo e na tela de exercícios do curso, mais o certificado de conclusão de curso