Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

[Projeto] Desafio de Manipulação de Listas em Python

O que torna esse desafio interessante é justamente a combinação entre a estrutura de dados e a lógica condicional que eu preciso implementar. Dentro do loop, eu acesso cada média pela sua posição e verifico se ao somar um ponto o resultado não ultrapassaria dez pontos. Se ultrapassar, eu coloco dez no lugar daquela média, caso contrário deixo a soma acontecer normalmente. Dessa forma consigo garantir que todas as notas respeitem o limite estabelecido enquanto aplico a bonificação de forma justa a quem precisa.

# Listas de alunos e suas médias atuais
lista_de_nomes = ["Maria Silva", "João Santos", "Ana Oliveira", "Pedro Costa", "Juliana Pereira"]
lista_de_medias = [8.9, 7.5, 4.2, 1.4, 9.5]

print("=" * 60)
print("AJUSTE DE MÉDIAS COM BONIFICAÇÃO")
print("=" * 60)

print("\n Médias originais:")
indice = 0
while indice < len(lista_de_medias):
    print(f"{lista_de_nomes[indice]}: {lista_de_medias[indice]}")
    indice += 1

# Aplicando a bonificação de 1 ponto, respeitando o limite máximo de 10
print("\n  Processando bonificação de 1 ponto para cada aluno...")
indice = 0
while indice < len(lista_de_medias):
    media_anterior = lista_de_medias[indice]
    media_com_bonus = media_anterior + 1
    
    # Verificação: se a soma ultrapassar 10, limitar a 10
    if media_com_bonus > 10:
        lista_de_medias[indice] = 10
    else:
        lista_de_medias[indice] = media_com_bonus
    
    indice += 1

print("\n Médias após bonificação:")
indice = 0
while indice < len(lista_de_medias):
    print(f"{lista_de_nomes[indice]}: {lista_de_medias[indice]}")
    indice += 1

# Análise de aprovação
print("\n Resultado final (aprovação com média ≥ 5.0):")
indice = 0
while indice < len(lista_de_nomes):
    media_final = lista_de_medias[indice]
    nome = lista_de_nomes[indice]
    
    if media_final >= 5.0:
        situacao = "APROVADO"
    else:
        situacao = "REPROVADO"
    
    print(f"{nome}: {media_final} - {situacao}")
    indice += 1

print("\n" + "=" * 60)
1 resposta

Olá novamente, João! Como vai?

Mais um projeto brilhante e com aquela marca registrada de organização que você traz para o fórum. É muito interessante notar como você estruturou o algoritmo usando a lógica de travamento no teto de 10.0. No jargão da programação e da ciência de dados, essa operação de limitar um valor a um teto (ou piso) fixo é chamada de clamping (ou saturação). Ela é vital para prevenir anomalias em modelos de Machine Learning e sistemas de score.

O seu raciocínio lógico usando os blocos if/else para o controle das notas e para a classificação de APROVADO ou REPROVADO funcionou perfeitamente. Os dados foram manipulados diretamente na lista de origem e os resultados no console saíram impecáveis.

Como você está avançando a passos largos nessa trilha de Inteligência Artificial Aplicada, vale a pena observar duas transformações de código que movem o seu script do estilo mais tradicional (comum em linguagens como C ou Java antigo) para o estilo puramente Pythônico (a forma nativa e otimizada como a comunidade Python escreve).


1. Substituir o while pelo for com enumerate()

No Python, o uso do laço while controlando o indice += 1 manualmente é uma abordagem que abrimos mão quase sempre que estamos lidando com coleções indexadas. O motivo? É muito fácil esquecer de incrementar a variável de controle e gerar um loop infinito, travando a memória.

Para caminhar por listas alterando os seus valores de forma segura e elegante, a melhor prática é usar o laço for junto com a função nativa enumerate(). Ela nos entrega, a cada rodada, tanto o índice da posição quanto o próprio item da lista de forma limpa.

Veja como o seu bloco de processamento da bonificação ganharia legibilidade:

# O enumerate cuida do índice de forma automática, sem risco de loop infinito
for indice, media_anterior in enumerate(lista_de_medias):
    media_com_bonus = media_anterior + 1
    
    if media_com_bonus > 10:
        lista_de_medias[indice] = 10
    else:
        lista_de_medias[indice] = media_com_bonus

2. Otimizar a lógica com a função min()

Lembra que no seu desafio de dicionários você usou a brilhante sacada do min(media_original + 1, 10)? Podemos trazer essa mesma elegância matemática para a manipulação de listas aqui!

Se combinarmos o for com o min(), você consegue enxugar todas aquelas linhas de validação do if/else em apenas uma única linha de atribuição direta:

for indice, media_anterior in enumerate(lista_de_medias):
    lista_de_medias[indice] = min(media_anterior + 1, 10)

Para fixar a diferença de comportamento entre as estruturas na memória e o fluxo lógico do seu processamento, o esquema abaixo ajuda a ilustrar visualmente como o Python manipula essas duas listas paralelas:

3. O Operador Ternário no resultado final

No seu último bloco, onde você define a string "APROVADO" ou "REPROVADO", você pode usar o chamado operador ternário do Python (uma estrutura condicional em linha). Em vez de gastar quatro linhas com if/else, você pode escrever de forma quase literária:

for indice, (nome, media_final) in enumerate(zip(lista_de_nomes, lista_de_medias)):
    # Lógica direta em uma única linha
    situacao = "APROVADO" if media_final >= 5.0 else "REPROVADO"
    print(f"{nome}: {media_final} - {situacao}")

Note que aqui eu combinei o enumerate com o zip() para que você tenha acesso ao índice, ao nome e à média final ao mesmo tempo, sem nenhuma complicação.

O seu código original cumpre rigorosamente todos os requisitos do desafio e está muito robusto, João. Aplicar essas pequenas otimizações idiomáticas vai deixar os seus futuros pipelines de dados para IA cada vez mais rápidos e fáceis de ler. Parabéns por mais um belíssimo trabalho!

Espero que possa ter lhe ajudado!