Olá, Cod3rs! Tudo tranquilo? Esse artigo é uma parte 2, então se você ainda não leu a parte 1, clique aqui para ser redirecionado: Classificar casas de Hogwarts com arrays em Python.

No artigo anterior, foi desenvolvido um programa que faz o papel do queridissimo chápeu seletor do universo de Harry Potter, e, classifica os alunos de Hogwarts em suas devidas casas, sendo elas; Grifinória, Lufa-Lufa, Sonserina e Corvinal.

Ao fim, a conclusão foi que após terminar um código, é importante revisar e buscar meios de otimiza-lo, como forma de aproveitar ao máximo a proposta de um exercicio. Durante o decorrer desse artigo, é isso o que faremos!

Divergência em resoluções

Você pode reparar que, ao fazer exercícios online e consultar a resolução, poderá ocorrer da sua resposta estar diferente do gabarito. Isso pode te assustar no início e o fazer pensar que a sua está incorreta. O que muitas vezes não é verdade.

Na programação, as resoluções vão de acordo com a lógica do humano desenvolvedor do código. Existem várias maneiras de resolver um problema.

E, muitas vezes você vai resolver diferente de outra pessoa.

Mão na massa: Definindo os arrays

Agora, vamos mudar a lógica do programa para que ele funcione de forma mais conscisa e que faça mais sentido com relação a construção do mundo fantasia de Harry Potter.

Definindo o array de casas:

hogwarts_casas = ["Grifinoria", "Lufa-Lufa", "Corvinal", "Sonserina"]

O dicionário de alunos agora terá informações adicionais já que o intuito é personalizar a seleção e classificação de casas:

hogwarts_alunos = [
   {"name": "Harry Potter", "ano": 5, "status_sangue": "Mestico", "posicao_quadribol": "Apanhador"},
   {"name": "Hermione Granger", "ano": 6, "status_sangue": "Nascido_trouxa", "posicao_quadribol": None},
   {"name": "Ron Weasley", "ano": 4, "status_sangue": "Sangue_puro", "posicao_quadribol": "Goleiro"},
   {"name": "Draco Malfoy", "ano": 6, "status_sangue": "Sangue_puro", "posicao_quadribol": "Apanhador"},
   {"name": "Luna Lovegood", "ano": 5, "status_sangue": "Sangue_puro", "posicao_quadribol": None},
   {"name": "Neville Longbottom", "ano": 4, "status_sangue": "Sangue_puro", "posicao_quadribol": None},
   {"name": "Cedric Diggory", "ano": 6, "status_sangue": "Sangue_puro", "posicao_quadribol": "Apanhador"},
   {"name": "Cho Chang", "ano": 5, "status_sangue": "Mestico", "posicao_quadribol": "Artilheiro"},
]

E a função para classificar os alunos de Hogwarts em casas com base nos critérios aprimorados:

def classificar_alunos_hogwarts():

Implementando a lógica

Para a classificação, uma boa lógica é usar if/else. Para isso, vamos primeiro criar um dicionário para armazenar os alunos pelas casas:

alunos_por_casa = {casa: [] for casa in hogwarts_casas}

E buscar os critérios pelas quais eles serão classificados:

for aluno in hogwarts_alunos:
       name = aluno["name"]
       ano = aluno["ano"]
       status_sangue = aluno["status_sangue"]
       posicao_quadribol = aluno["posicao_quadribol"]

O código acima usa um loop for para percorrer cada aluno na lista hogwarts_alunos e extrair seus nomes, ano em Hogwarts, status de sangue e posição no Quadribol.

Esses detalhes serão usados ​​na parte seguinte do código para determinar a qual casa cada aluno pertence com base nos critérios de classificação especificados.

E, como já dito, vamos usar if/else para esse trabalho:


       if "Potter" in name:
           alunos_por_casa["Grifinoria"].append(aluno)
       elif status_sangue == "Sangue_puro" and posicao_quadribol in ["Apanhador"]:
           alunos_por_casa["Sonserina"].append(aluno)
       elif ano >= 4 and posicao_quadribol == "Goleiro":
           alunos_por_casa["Grifinoria"].append(aluno)
       elif ano == 6 and posicao_quadribol is None:
           alunos_por_casa["Corvinal"].append(aluno)
       else:
           alunos_por_casa["Lufa-Lufa"].append(aluno)

Nessa parte do código, é utilizada uma série de instruções if, elif e else para avaliar diferentes condições para cada aluno de Hogwarts.

Dependendo do nome do aluno, ano, status de sangue e posição no Quadribol, eles são designados para a casa de Hogwarts apropriada.

O processo de seleção considera vários aspectos da formação e habilidades de cada aluno, levando isso em consideração ao classificar o aluno, de forma muito mais parecida com o mundo mágico de Hogwarts!

Os critérios são:

  • Se o nome do aluno tiver “Potter”, ele será classificado para a Grifinória.
  • Se o aluno tiver status de sangue como “Sangue_puro” e sua posição no quadribol for “Apanhador”, ele será designado para a Sonserina.
  • Se o aluno estiver no quarto ano ou acima e sua posição no quadribol for “Goleiro”, ele será designado para a Grifinória.
  • Se o aluno estiver no sexto ano e não tiver uma posição no quadribol, ele será designado para a Corvinal.
  • Todos os outros alunos são designados para Lufa-Lufa.

E, após a lógica implementada, vamos imprimir o resultado:


   for casa in hogwarts_casas:
       casa_alunos = alunos_por_casa[casa]
       print(f"{casa}:")
       for aluno in casa_alunos:
           print(f"- {aluno['name']}")

O trecho acima imprime o resultado geral; uma lista classificada de alunos de Hogwarts exibida por casa, com o nome de cada aluno listado sob o nome da casa correspondente.

Essa parte formata e mostra certinho os quais alunos pertencem a quais casas de Hogarts.

Resultado

E, no fim, basta chamar a função:

classificar_alunos_hogwarts()

Que terá como output:

Grifinoria:
- Harry Potter
- Ron Weasley
Lufa-Lufa:
- Luna Lovegood
- Neville Longbottom
- Cho Chang
Corvinal:
- Hermione Granger
Sonserina:
- Draco Malfoy
- Cedric Diggory

Que não ficou perfeito, mas ficou bem melhor que a versão passada!

Conclusão

Otimizamos um código já feito antes com uma lógica diferente e mais alinhada com a escola de magia e bruxaria de Hogwarts.

Sinta-se à vontade para personalizar ainda mais a lógica de classificação ou adicionar mais elementos do universo de Harry Potter.