1
resposta

List comprehension para vários IF ELIF ELSE

https://cursos.alura.com.br/forum/topico-tentei-reproduzir-com-a-lista-sem-usar-o-numpy-e-nao-consigo-o-mesmo-resultado-pode-ajudar-obriagdo-152380

No tópico acima, o usuário quer reproduzir o calculo do IMC usando list comprehension, porém, a resposta fornecida não considera as lists. Lendo o tópico dele fiquei com a mesma dúvida. Percorrer as listas usando FOR é simples, mas não estou conseguindo chegar no mesmo resultado usando as lists. Para isso, fiz um outro código usando FOR abaixo:

import numpy as np

peso = np.array([84, 75, 290])
altura = np.array([1.84, 1.75, 3])

for i in peso:
  for j in altura:
    imc = round((i/(j**2)),2)
    if (imc < 30.0):
      print('NAO HÁ OBESIDADE')
      print(f'Peso: {i}; Altura {j}; IMC: {imc}')
    elif (imc >= 30.0 and imc < 35.0):
      print('OBESIDADE NÍVEL I')
      print(f'Peso: {i}; Altura {j}; IMC: {imc}')
    elif (imc >= 35.0 and imc < 40.0):
      print('OBESIDADE NÍVEL II')
      print(f'Peso: {i}; Altura {j}; IMC: {imc}')
    else:
      print('OBESIDADE MÓRBIDA')
      print(f'Peso: {i}; Altura {j}; IMC: {imc}')

Como eu faria o mesmo usando as lists? Tentei da seguinte forma mas não funcinou:

a = [if imc < 30: print('NAO HÁ OBESIDADE') elif (imc >= 30.0 and imc < 35.0): print('OBESIDADE NÍVEL I') elif (imc >= 35.0 and imc < 40.0): print(f'Peso: {i}; Altura {j}; IMC: {i}') else print('NAO HÁ OBESIDADE')]

Obs: talvez seja inadequado usar LCs quando o codigo fica muito extenso, mas não quero entrar nesse merito agora.

1 resposta

Oi, Rogério! Tudo bem contigo?

Podemos acumular LCs em uma mesma LC seguindo o esquemático:

(o que acontece caso verdade) if (condição) else (o que acontece caso falso)

No caso, como seu for considera casos em que é mentira, acumulados LCs dentro da parte (o que acontece caso falso). Vale lembrar que ele vai rodar execuções, então por utilizar prints como execuções, nós não podemos colocá-las dentro de uma lista, então precisamos remover essa variável. Seguindo seu laço de condição a estrutura com prints pode ser observada abaixo:

import numpy as np

peso = np.array([84, 75, 290])
altura = np.array([1.84, 1.75, 3])

for i in peso:
  for j in altura:
    imc = round((i/(j**2)),2)
    print(f'NAO HÁ OBESIDADE \nPeso: {i}; Altura {j}; IMC: {imc}') if (imc < 30.0) else (print(f'OBESIDADE NÍVEL I \nPeso: {i}; Altura {j}; IMC: {imc}') if (imc >= 30.0 and imc < 35.0) else (print('OBESIDADE NÍVEL II \nPeso: {i}; Altura {j}; IMC: {imc}')if (imc >= 35.0 and imc < 40.0) else print(f'OBESIDADE MÓRBIDA \nPeso: {i}; Altura {j}; IMC: {imc}')))

Caso você queira acumular os dados em uma lista, você precisa que a execução retorne uma string, e acumular eles em uma lista, como mostrado abaixo:

import numpy as np

peso = np.array([84, 75, 290])
altura = np.array([1.84, 1.75, 3])

a = []

for i in peso:
  for j in altura:
    imc = round((i/(j**2)),2)
    a.append((f'NAO HÁ OBESIDADE \nPeso: {i}; Altura {j}; IMC: {imc}') if (imc < 30.0) else ((f'OBESIDADE NÍVEL I \nPeso: {i}; Altura {j}; IMC: {imc}') if (imc >= 30.0 and imc < 35.0) else (('OBESIDADE NÍVEL II \nPeso: {i}; Altura {j}; IMC: {imc}')if (imc >= 35.0 and imc < 40.0) else (f'OBESIDADE MÓRBIDA \nPeso: {i}; Altura {j}; IMC: {imc}'))))
a

Espero ter te ajudado. Bons estudos!