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!

2
respostas

Explorando estruturas de dados em Python

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]

indice = 0

while indice <len(lista_de_medias):

  nota_atualizada = min(lista_de_medias [indice] + 1, 10)
  lista_de_medias [indice] = nota_atualizada
  print(f"Aluno: {lista_de_nomes[indice]} | Nova Média: {lista_de_medias[indice]}")
  indice = indice + 1

else:
    print ("Notas atualizadas")
2 respostas

Oi, Diego! Como vai?

Agradeço por compartilhar.

Sua solução ficou bem organizada: você percorreu a lista de médias com while, atualizou cada nota usando min() para não passar de 10 e exibiu o nome da pessoa estudante junto com a nova média. O else também funciona nesse caso, pois será executado ao final do while.

Dica: para deixar o código mais simples, você também pode usar for com range(), que evita controlar o índice manualmente. Continue praticando, pois esse tipo de exercício ajuda bastante a entender listas, índices e atualização de valores em Python.

Conteúdos relacionados
Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Ótima solução, Diego. Gostaria de expandir um pouco sobre o que você fez, porque há nuances técnicas interessantes nessa abordagem que valem ser destacadas, especialmente para quem está começando a trabalhar com estruturas de dados em Python.

O uso da função min() que você implementou é particularmente elegante. Quando você escreve min(lista_de_medias[indice] + 1, 10), o Python avalia a soma primeiro e depois compara os dois valores, retornando o menor deles. Isso resolve o problema em uma única operação, sem necessidade de desdobrar a lógica em um if condicional explícito. Do ponto de vista computacional, essa é uma estratégia mais direta, mas também demonstra um pensamento importante em programação: frequentemente existem múltiplas formas de expressar a mesma ideia, e algumas delas são mais concisas e legíveis do que outras.

Agora, queria chamar atenção para o bloco else que aparece após seu while. Essa é uma funcionalidade que muitos iniciantes desconhecem ou subestimam. Em Python, um else vinculado a um loop while (ou for) executa apenas quando o loop termina naturalmente, ou seja, quando a condição se torna falsa sem que um break interrompa a execução. Se você tivesse, por exemplo, um break dentro do loop para interromper quando encontrasse uma condição específica, o else não executaria. Isso é diferente de uma estrutura condicional tradicional e abre possibilidades interessantes. Imagine um cenário onde você está buscando um aluno específico na lista e precisa fazer algo só se o aluno não for encontrado antes de o loop terminar, um padrão comum em verificações de integridade de dados.

Quanto às boas práticas que vejo no seu código, destaco o uso de uma variável intermediária chamada nota_atualizada. Muitos iniciantes tentariam fazer tudo em uma única linha, diretamente na atribuição, o que torna o código menos legível. Você criou um espaço para armazenar esse cálculo temporário, deixando claro qual é a transformação acontecendo. Isso é especialmente importante quando você trabalha com estruturas mais complexas, onde múltiplas transformações podem estar acontecendo simultaneamente. A clareza do código aqui facilita tanto a sua compreensão quanto a manutenção futura e a detecção de erros.

Também observo que você imprime o resultado de cada atualização dentro do loop. Isso é uma prática valiosa em desenvolvimento, porque oferece feedback imediato sobre o que está acontecendo. Quando você trabalha com grandes volumes de dados, esse tipo de rastreamento pode ser crucial para diagnosticar problemas. Porém, em cenários de produção, você precisaria considerar se essa verbosidade é realmente necessária, especialmente se estivesse processando listas com milhares de elementos.

Seguindo a sugestão de Lorena sobre usar for com range(), e incorporando também as reflexões sobre o else e as variáveis intermediárias, aqui está uma versão reformulada que demonstra essas práticas de forma ainda mais clara:

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("=" * 70)
print("SISTEMA DE AJUSTE DE MÉDIAS COM BONIFICAÇÃO")
print("=" * 70)

print("\n MÉDIAS INICIAIS:")
print("-" * 70)
for indice in range(len(lista_de_nomes)):
    print(f"  {lista_de_nomes[indice]:20} | Média: {lista_de_medias[indice]}")

print("\n  PROCESSANDO BONIFICAÇÃO DE 1 PONTO...")
print("-" * 70)

for indice in range(len(lista_de_medias)):
    media_original = lista_de_medias[indice]
    media_candidata = media_original + 1
    media_final = min(media_candidata, 10)
    
    lista_de_medias[indice] = media_final
    
    diferenca = media_final - media_original
    print(f"  {lista_de_nomes[indice]:20} | {media_original} → {media_final} (ajuste: +{diferenca})")
else:
    print("\n Todas as médias foram processadas com sucesso")

print("\n RESULTADO FINAL (aprovação com média ≥ 5.0):")
print("-" * 70)

for indice in range(len(lista_de_nomes)):
    media_final = lista_de_medias[indice]
    nome = lista_de_nomes[indice]
    status = "APROVADO" if media_final >= 5.0 else "REPROVADO"
    
    print(f"  {nome:20} | Média: {media_final:5.1f} | {status}")

print("\n" + "=" * 70)

Nesta versão reformulada, usei for com range() porque elimina a necessidade de gerenciar manualmente a variável índice, reduzindo a possibilidade de erros fora dos limites da lista. Criei variáveis explícitas para cada estágio da transformação (media_original, media_candidata, media_final), tornando o fluxo lógico mais transparente. O else agora fornece feedback de conclusão, e utilizei formatação de strings com espaçamento para melhorar a legibilidade da saída. Essa abordagem é especialmente útil quando você trabalha em equipe ou precisa retomar um código meses depois, porque a intenção de cada operação fica imediatamente clara.