Solucionado (ver solução)

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!

Solucionado
(ver solução)
2
respostas

[Dúvida] Uso de List Comprehention VS Map

Bom dia, pessoal.

Estudando o curso Python para Dados: trabalhando com funções, estruturas de dados e exceções, tive contato com os recursos da linguagem Python map e list comprehetion, e pude notar que muitos problemas de organizar informações em listas podem ser resolvidos com ambas os recursos. Como exemplo, deixei aqui a resposta da atividade 7 da aula 3 desse curso.

Problema

  1. Uma clínica analisa dados de pacientes e armazena o valor numérico da glicose em um banco de dados e gostaria de rotular os dados da seguinte maneira:
  • Glicose igual ou inferior a 70: 'Hipoglicemia'
  • Glicose entre 70 a 99: 'Normal'
  • Glicose entre 100 e 125: 'Alterada'
  • Glicose superior a 125: 'Diabetes'

A clínica disponibilizou parte dos valores e sua tarefa é criar uma lista de tuplas usando list comprehension contendo o rótulo e o valor da glicemia em cada tupla.

Código da solução

from pprint import pprint

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]

def get_label(value):
    if value <= 70:
        return 'Hipoglicemia'
    elif value <= 99:
        return 'Normal'
    elif value <= 125:
        return 'Alterada'
    else:
        return 'Diabetes'

# Usando List Comprehetion
labels = [get_label(value) for value in glicemia]
print(f"{'  Resultado usando list comprehention  ':=^80}")
pprint(labels)

# Usando Map
labels = list(map(get_label, glicemia))
print(f"{'  Resultado usando map  ':=^80}")
pprint(labels)

Resultado

====================  Resultado usando list comprehention  =====================
['Diabetes',
 'Normal',
 'Hipoglicemia',
 'Normal',
 'Alterada',
 'Hipoglicemia',
 'Hipoglicemia',
 'Diabetes',
 'Normal',
 'Hipoglicemia',
 'Hipoglicemia',
 'Normal',
 'Hipoglicemia',
 'Alterada',
 'Alterada',
 'Hipoglicemia',
 'Normal',
 'Normal',
 'Alterada',
 'Normal',
 'Diabetes',
 'Hipoglicemia',
 'Normal',
 'Normal']
============================  Resultado usando map  ============================
['Diabetes',
 'Normal',
 'Hipoglicemia',
 'Normal',
 'Alterada',
 'Hipoglicemia',
 'Hipoglicemia',
 'Diabetes',
 'Normal',
 'Hipoglicemia',
 'Hipoglicemia',
 'Normal',
 'Hipoglicemia',
 'Alterada',
 'Alterada',
 'Hipoglicemia',
 'Normal',
 'Normal',
 'Alterada',
 'Normal',
 'Diabetes',
 'Hipoglicemia',
 'Normal',
 'Normal']

Diante dessa percepção, eu gostaria de discutir se existe algum modo preferencial de resolver esse problema, o que o pessoal do mercado diz em relação a isso do ponto de vista de desempenho e legibilidade do código.

Atentamente,
Myke Albuquerque Pinto de Oliveira

2 respostas
solução!

Olá, Myke, como vai?

Ótima observação sobre essas duas abordagens. Ambas produzem resultados idênticos, mas diferem em aspecto importantes. A list comprehension é geralmente preferida no Python moderno por ser mais legível e pythônica. Ela expressa a intenção de forma clara e fica mais fácil de entender durante uma revisão de código. O desempenho é ligeiramente superior, já que evita a chamada de função map e a conversão para lista.

Map é uma função da programação funcional. Seu maior valor aparece quando você trabalha com funções prontas ou precisa compor operações complexas. No seu caso específico, a list comprehension vence em clareza. Considere este exemplo usando lambda:

list(map(lambda x: 'Normal' if x <= 99 else 'Alterada', glicemia))

Mesmo assim, a list comprehension fica mais direta:

['Normal' if x <= 99 else 'Alterada' for x in glicemia]

Reserve map para casos onde você está reutilizando funções prontas ou trabalhando com múltiplas sequências.

Qual dessas duas abordagens você se sente mais confortável utilizando em seus projetos futuros?

O fórum está à sua disposição para aprofundar essa discussão.

Myke, um abraço.

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

Olá, Mike. Espero que essa mensagem te encontre bem.

Muito obrigado pela sua resposta, para mim ambas as abordagens são bastante confortáveis, mas também porque eu acho que os exemplos até aqui são simples. Por outro lado, se o objetivo for tanto transformar e filtrar os dados, acredito que não ficaria não legível usando funções, porque precisariamos tanto de map como de filter, e ficaria com muito alinhamento como list(filter(map(...))). Para esse caso, eu prefiro [<expression> for <> if <>]. Provavelmente eu vou usar mais list comprehension do que as funções map e filter, mas é sempre bom conhecer outras formas para ler códigos de outras pessoas.

Obrigado, mais uma vez, e atentamente.
Myke Albuquerque Pinto de Oliveira.