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!

1
resposta

[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

1 resposta

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!