List e Dict Comprehensions: Elegância e Performance em Python

0 – Python
10 – Declarativa
10.1 – SQLAlchemy (ORM)
10.2 – Django Models
10.3 – List/dict comprehensions
10.4 – Regex (expressões regulares)
LEGENDA
Nivel_1
Nivel_2
Nivel_3

Comprehensions são uma sintaxe concisa para criar coleções. Elas existem para listas, dicionários e conjuntos. Primeiramente, elas substituem loops tradicionais com append. O resultado é um código mais limpo e legível. Além disso, comprehensions são geralmente mais rápidas. Isso acontece porque são otimizadas em C nativo. Por exemplo, [x*2 for x in range(10)] dobra números. Sem comprehension, você precisaria de três linhas. Portanto, o ganho de produtividade é significativo. Essa característica foi inspirada em Haskell e outras linguagens. Assim, Python ganhou uma ferramenta expressiva e poderosa.

Sintaxe e características das comprehensions

A sintaxe básica de list comprehension é:

\([\text{expressão} \text{ for } \text{item} \text{ in } \text{iterável} \text{ if } \text{condição}]\)
Isso significa: para cada item, aplique a expressão. O if é opcional e filtra os elementos. Uma dict comprehension é similar, mas com chave e valor:
\(\{\text{chave: valor} \text{ for } \text{item} \text{ in } \text{iterável}\}\)
Primeiramente, evite aninhar muitas comprehensions. Duas ou três já prejudicam a legibilidade do código. Além disso, mantenha a condição if simples. Isso foi projetado para clareza, não para complexidade. Portanto, use comprehensions para transformações diretas.

Outra característica importante é a memória eficiente. Para listas muito grandes, use generator expressions. Elas usam parênteses em vez de colchetes. Por exemplo, (x*2 for x in range(10**6)). Isso não aloca a lista inteira na memória. Consequentemente, seu programa usa menos RAM. Essa dica é valiosa para processamento de grandes volumes.

Quando utilizar comprehensions no seu código

Use comprehensions para mapeamentos e filtros simples. Transformar uma lista aplicando uma função é ideal. Filtrar elementos baseado em uma condição também funciona bem. Por exemplo, pares de uma lista: [x for x in lista if x%2==0]. Outro bom uso é criar dicionários a partir de listas. Também são ótimas para inverter pares chave-valor. Por outro lado, evite comprehensions com efeitos colaterais. Imprimir ou salvar arquivos dentro delas confunde. Primeiramente, mantenha a expressão pura (sem side effects). Se o loop precisa de múltiplas linhas, use for tradicional. Além disso, não use para estruturas de dados aninhadas complexas. Isso foi percebido como anti-padrão pela comunidade. Portanto, valorize a legibilidade acima da concisão.

Outro bom uso é em testes de transformações de dados. Você pode rapidamente visualizar resultados no terminal. Cientistas de dados usam bastante essas construções. Use também para inicializar dicionários com valores padrão. Por exemplo, {nome:0 for nome in lista_nomes}. Isso cria um contador ou acumulador rapidamente. Portanto, dominar comprehensions é essencial em Python.

Exemplo prático: transformando listas e dicionários

O código abaixo mostra diversos usos de comprehensions. Começamos com listas e evoluímos para dicionários. Adicionamos condições para filtrar dados específicos. Também demonstramos aninhamento (com moderação). Por fim, comparamos performance com loops tradicionais. Observe como o tempo de execução é melhor. Isso ocorre principalmente para grandes volumes. Vamos ao código comentado para explorar cada caso.

Nos exemplos, a diferença de sintaxe é clara. A versão com comprehension reduz drasticamente o código. Isso acontece sem perder legibilidade ou performance. Primeiramente, note a ausência de append() manual. Isso elimina um tipo comum de erro humano. Além disso, a intenção do código fica evidente. Qualquer programador Python entende rapidamente. Por exemplo, [x**2 for x in lista] é autoexplicativo. Já o loop equivalente exige leitura linha por linha. Portanto, comprehensions melhoram a comunicação do código. Use-as sempre que a transformação for clara e direta. Isso é considerado pythonico pela comunidade.

Outro ponto importante é a performance superior. No teste com 10 milhões de elementos, a diferença aparece. Comprehensions rodam em código C otimizado nativamente. Loops tradicionais têm overhead de interpretação por iteração. Isso foi medido e comprovado em diversos benchmarks. No entanto, a diferença só importa para grandes volumes. Para listas pequenas, a legibilidade é o fator principal. Primeiramente, escreva código claro e correto. Depois, se necessário, otimize onde houver gargalos. Portanto, não transforme todo loop em comprehension cegamente. Avalie o contexto e a complexidade da operação. Assim, você equilibra elegância e manutenibilidade.

✅ Quando usar
Mapeamento 1:1 (ex: quadrados)
Filtros simples (ex: pares)
Transformações de strings
Criação de dicionários
Conjuntos únicos
Inversão de pares
❌ Quando evitar
Side effects (print, salvar)
Lógica com muitas linhas
Aninhamento profundo
Tratamento de exceções
Recursão ou iteração complexa
Performance muito crítica

Finalmente, lembre-se das comprehensions para conjuntos. Use set quando a ordem não importar. Para dicionários, as chaves devem ser únicas. Repetições são resolvidas pela última ocorrência. Além disso, você pode usar condicionais múltiplas. Por exemplo, [x for x in lista if cond1 and cond2]. Isso é perfeitamente aceitável e legível. Evite, porém, if-else no final da expressão. Nesse caso, use expressao if cond else outra. Isso foi projetado para substituir operadores ternários. Portanto, explore todas as variantes disponíveis. A prática leva à maestria nesse recurso versátil.

Deixe um comentário