Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Aula 3 / Questão 7) Faz sentido usar uma sequência de "if else" no dict comprehension?

Nessa questão precisamos classificar uma lista de glicemias entre hipoglicemia, normal, alterada e diabetes.

glicemia = [129, 82, 60, 97, 101, 65, 62, 167, 87, 53, 58, 92, 66, 120, 109, 62, 86, 96, 103, 88, 155, 52, 89, 73]

A solução proposta é a seguinte:

# Solução proposta
rotulos = [('Hipoglicemia', glicose) if glicose <= 70 else ('Normal', glicose) if glicose < 100 else ('Alterada', glicose) if glicose < 125 else ('Diabetes', glicose) for glicose in glicemia]
print(rotulos)

Minha solução foi criar uma função separada para classificar:

# Minha solução
classificacao_glicemia = {'Hipoglicemia':70,'Normal':99,'Alterada':125}
def classificar_glicemia(glicemia:float):
    classificacao_glicemia = {'Hipoglicemia':70,'Normal':99,'Alterada':125}
    for i in classificacao_glicemia:
        if glicemia<classificacao_glicemia[i]:
            return i
        else:
            return 'Diabetes'

[(classificar_glicemia(x), x) for x in glicemia]

Achei a resposta proposta um pouco ilegível, por mais que eu imagine que seja mais eficiente. Então fiquei em dúvida em qual seria a boa prática. Dessa forma, minhas dúvidas são:

  1. É mais eficiente usar a cadeia de if's e else's diretamente ou aplicar uma função?
  2. Existe uma estrutura mais enxuta de aplicar um retorno condicional como fiz no meu código?
1 resposta
solução!

Oi Pedro, tudo bem?

Em termos de eficiência, a diferença entre usar uma cadeia de if-else diretamente na compreensão de lista e encapsular essa lógica em uma função é mínima. Mas, usar uma função pode tornar o código mais legível e organizado, principalmente se a lógica de classificação for complexa ou se você precisar reutilizar essa lógica em outros lugares do seu código.

A solução proposta na aula é mais compacta. Já a sua solução, ao usar uma função, é mais fácil de entender e manter, pois separa a lógica de classificação em um bloco de código distinto.

A sua abordagem com a função já é bastante clara e legível. Se você preferir manter tudo em uma linha, poderia usar uma função lambda dentro da compreensão de lista, embora isso não seja muito comum devido à complexidade que pode adicionar.

classificacao = lambda glicose: 'Hipoglicemia' if glicose <= 70 else 'Normal' if glicose < 100 else 'Alterada' if glicose < 125 else 'Diabetes'
rotulos = [(classificacao(glicose), glicose) for glicose in glicemia]

Ambas atendem ao objetivo, e a escolha entre elas dependerá da preferência pessoal. Se a legibilidade é uma prioridade para você, a sua solução com uma função é uma excelente escolha.

Espero ter ajudado.

Qualquer dúvida, não hesite em compartilhar no fórum.

Abraços!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado