1
resposta

Minha versão da solução desse caso

import re

grades_list = input("Insira a lista de grades separadas por vírgula: ").strip().split(",") # pra dar um pré-processamento desses dados
valid_grades = []
grade_template = r'(10|\d).\d{1,2}' # garantir que a nota é de 0 a 10 (com um possível erro que eu vou citar abaixo)

if grades_list:
    for grade in grades_list:
        grade_organized = grade.strip() # pra garantir que os valores (que podem ser aceitos) serão aceitos pelo re.match aqui abaixo
        if re.match(grade_template, grade_organized):
            valid_grades.append(float(grade_organized))
else:
    print("Não foi inserido nada na lista de notas.")
               
if valid_grades:
        average = sum(valid_grades) / len(valid_grades) 
        print(f"Média final da turma: {average:.2f}")   
else:
    print("Os valores não foram inseridos no formato correto. Tente novamente.")    

Eu fiz essa versão dessa forma para tentar garantir que a entrada fosse de 0.0 (ou 0.00) até 10.0 (ou 10.00). Só tem um pequeno problema. Esse caso acima aceita 10.35 como caso correto, o que eu não achei uma solução boa pra resolver sem o código acima ficar uma bela de uma bagunça.

1 resposta

Oi, tudo bem? 😊

Parabéns pela sua solução! 👏

Sua abordagem com expressões regulares é muito interessante para validar as notas.

Para evitar que notas como 10.35 sejam aceitas, você pode ajustar a expressão regular para garantir que, quando o valor for 10, não haja mais dígitos após o ponto.

Uma possível solução seria:

grade_template = r'^(10(\.0{1,2})?|\d(\.\d{1,2})?)$'

Nessa expressão:

  • ^ e $ garantem que a string inteira corresponda ao padrão, evitando que parte da string seja ignorada.
  • 10(\.0{1,2})? permite 10, 10.0 ou 10.00.
  • \d(\.\d{1,2})? permite notas de 0 a 9, seguidas ou não de uma parte decimal com um ou dois dígitos.

Com essa alteração, a validação ficará mais precisa e evitará notas inválidas. 💪

🎓 Para saber mais:

Espero ter ajudado! 🤗