List comprehension é uma das features mais elegantes e poderosas do Python. Com ela, você cria listas de forma concisa, legível e eficiente em apenas uma linha. Neste guia completo, você aprenderá desde o básico até técnicas avançadas que vão revolucionar a forma como você escreve código Python.

🎯 O Que É List Comprehension?

List comprehension é uma sintaxe compacta para criar listas baseadas em sequências existentes. É uma forma pythônica (idiomática) de transformar, filtrar e processar dados sem usar loops tradicionais.

Problema: Você precisa criar uma lista com os quadrados dos números de 1 a 10.

# Forma tradicional (verbose)
quadrados = []
for numero in range(1, 11):
    quadrados.append(numero ** 2)

print(quadrados)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# Com list comprehension (pythônico)
quadrados = [numero ** 2 for numero in range(1, 11)]

print(quadrados)  # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

A segunda versão é mais clara, menos propensa a erros e mais eficiente em termos de memória!

📝 Sintaxe Básica

A estrutura fundamental de uma list comprehension é:

[expressão for item in iterável]

Vamos ver vários exemplos práticos:

# Criar lista de números
numeros = [x for x in range(10)]
print(numeros)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# Dobrar valores
dobrados = [x * 2 for x in range(5)]
print(dobrados)  # [0, 2, 4, 6, 8]

# Trabalhar com strings
frutas = ["maçã", "banana", "laranja"]
maiusculas = [fruta.upper() for fruta in frutas]
print(maiusculas)  # ['MAÇÃ', 'BANANA', 'LARANJA']

# Extrair comprimentos
comprimentos = [len(fruta) for fruta in frutas]
print(comprimentos)  # [4, 6, 7]

# Operações matemáticas
celsius = [0, 10, 20, 30, 40]
fahrenheit = [(temp * 9/5) + 32 for temp in celsius]
print(fahrenheit)  # [32.0, 50.0, 68.0, 86.0, 104.0]

🔍 List Comprehension com Condições (Filtros)

Você pode adicionar condições para filtrar elementos durante a criação da lista:

[expressão for item in iterável if condição]

Exemplos de Filtros

# Apenas números pares
numeros = range(20)
pares = [n for n in numeros if n % 2 == 0]
print(pares)  # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# Apenas números ímpares
impares = [n for n in numeros if n % 2 != 0]
print(impares)  # [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

# Filtrar palavras longas
palavras = ["Python", "é", "incrível", "e", "poderoso"]
longas = [palavra for palavra in palavras if len(palavra) > 3]
print(longas)  # ['Python', 'incrível', 'poderoso']

# Filtrar números positivos
valores = [-5, -2, 0, 3, 7, -1, 10]
positivos = [v for v in valores if v > 0]
print(positivos)  # [3, 7, 10]

# Strings que começam com vogal
nomes = ["Ana", "Bruno", "Isabela", "Carlos", "Eduardo"]
com_vogal = [nome for nome in nomes if nome[0].lower() in 'aeiou']
print(com_vogal)  # ['Ana', 'Isabela', 'Eduardo']

🎨 If-Else em List Comprehension

Quando você precisa de transformação condicional (não apenas filtro), use if-else antes do for:

[expressão_if if condição else expressão_else for item in iterável]

Exemplos Práticos

# Par ou ímpar
numeros = [1, 2, 3, 4, 5, 6]
tipos = ["par" if n % 2 == 0 else "ímpar" for n in numeros]
print(tipos)  # ['ímpar', 'par', 'ímpar', 'par', 'ímpar', 'par']

# Classificar notas
notas = [8.5, 5.0, 7.5, 3.0, 9.0]
situacao = ["Aprovado ✅" if nota >= 7 else "Reprovado ❌" for nota in notas]
print(situacao)

# Substituir valores nulos
dados = [10, None, 30, None, 50]
limpos = [valor if valor is not None else 0 for valor in dados]
print(limpos)  # [10, 0, 30, 0, 50]

# Aplicar desconto
precos = [100, 200, 300, 400]
# 10% desconto se > 200, senão preço normal
com_desconto = [preco * 0.9 if preco > 200 else preco for preco in precos]
print(com_desconto)  # [100, 200, 270.0, 360.0]

🔁 List Comprehension Aninhada

Você pode ter múltiplos fors em uma única comprehension, útil para trabalhar com matrizes e combinações. Essa técnica é especialmente poderosa quando combinada com dicionários:

# Criar matriz 3x3
matriz = [[i * 3 + j for j in range(1, 4)] for i in range(3)]
print(matriz)
# [[1, 2, 3],
#  [4, 5, 6],
#  [7, 8, 9]]

# Achatar lista de listas
lista_aninhada = [[1, 2, 3], [4, 5], [6, 7, 8, 9]]
achatada = [item for sublista in lista_aninhada for item in sublista]
print(achatada)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

# Combinações de produtos
cores = ["vermelho", "azul"]
tamanhos = ["P", "M", "G"]
produtos = [f"{cor}-{tamanho}" for cor in cores for tamanho in tamanhos]
print(produtos)
# ['vermelho-P', 'vermelho-M', 'vermelho-G', 'azul-P', 'azul-M', 'azul-G']

# Coordenadas de tabuleiro
tabuleiro = [(x, y) for x in range(8) for y in range(8)]
print(f"Total de posições: {len(tabuleiro)}")  # 64

🎯 Projeto Prático: Processamento de Dados de Alunos

Vamos criar um sistema completo usando list comprehensions. Este exemplo também demonstra como combinar com funções:

class SistemaNotas:
    def __init__(self):
        self.alunos = [
            {"nome": "Ana Silva", "notas": [8.5, 9.0, 7.5]},
            {"nome": "Bruno Costa", "notas": [6.0, 5.5, 6.5]},
            {"nome": "Carla Santos", "notas": [9.5, 10.0, 9.0]},
            {"nome": "Daniel Souza", "notas": [4.0, 5.0, 3.5]},
            {"nome": "Elena Oliveira", "notas": [7.0, 8.0, 7.5]}
        ]
    
    def calcular_medias(self):
        """Calcula média de cada aluno"""
        return [
            {
                "nome": aluno["nome"],
                "media": sum(aluno["notas"]) / len(aluno["notas"])
            }
            for aluno in self.alunos
        ]
    
    def alunos_aprovados(self, media_minima=7.0):
        """Lista alunos aprovados"""
        medias = self.calcular_medias()
        return [
            aluno["nome"] 
            for aluno in medias 
            if aluno["media"] >= media_minima
        ]
    
    def alunos_em_recuperacao(self):
        """Alunos entre 5 e 7"""
        medias = self.calcular_medias()
        return [
            aluno["nome"] 
            for aluno in medias 
            if 5 <= aluno["media"] < 7
        ]
    
    def melhor_nota_por_aluno(self):
        """Retorna melhor nota de cada aluno"""
        return [
            {
                "nome": aluno["nome"],
                "melhor_nota": max(aluno["notas"])
            }
            for aluno in self.alunos
        ]
    
    def relatorio_completo(self):
        """Gera relatório formatado"""
        medias = self.calcular_medias()
        
        relatorio = [
            f"{aluno['nome']}: {aluno['media']:.1f} - " +
            ("✅ Aprovado" if aluno['media'] >= 7 
             else "⚠️ Recuperação" if aluno['media'] >= 5 
             else "❌ Reprovado")
            for aluno in medias
        ]
        
        return "\n".join(relatorio)


# Usando o sistema
sistema = SistemaNotas()

print("📊 MÉDIAS DOS ALUNOS")
print("="*50)
for aluno in sistema.calcular_medias():
    print(f"{aluno['nome']}: {aluno['media']:.2f}")

print("\n✅ ALUNOS APROVADOS")
print("-"*50)
for nome in sistema.alunos_aprovados():
    print(f"- {nome}")

print("\n📋 RELATÓRIO COMPLETO")
print("="*50)
print(sistema.relatorio_completo())

⚡ List Comprehension vs Loops: Performance

List comprehensions são geralmente mais rápidas que loops for tradicionais:

import time

# Teste com 1 milhão de elementos
n = 1_000_000

# Loop tradicional
start = time.time()
resultado_loop = []
for i in range(n):
    resultado_loop.append(i * 2)
tempo_loop = time.time() - start

# List comprehension
start = time.time()
resultado_comp = [i * 2 for i in range(n)]
tempo_comp = time.time() - start

print(f"Loop tradicional: {tempo_loop:.4f}s")
print(f"List comprehension: {tempo_comp:.4f}s")
print(f"Ganho: {((tempo_loop - tempo_comp) / tempo_loop * 100):.1f}%")

# Resultado típico:
# Loop tradicional: 0.1234s
# List comprehension: 0.0856s  
# Ganho: 30.6%

🎨 Set e Dict Comprehensions

Python também oferece comprehensions para sets e dicionários:

Set Comprehension

# Set comprehension (sem duplicatas)
numeros = [1, 2, 2, 3, 3, 3, 4, 4, 5]
quadrados_unicos = {n ** 2 for n in numeros}
print(quadrados_unicos)  # {1, 4, 9, 16, 25}

# Letras únicas em maiúsculas
texto = "Python é incrível"
letras = {char.upper() for char in texto if char.isalpha()}
print(letras)  # {'C', 'E', 'H', 'I', 'L', 'N', 'O', 'P', 'R', 'T', 'V', 'Y'}

Dict Comprehension

# Criar dicionário de quadrados
quadrados_dict = {n: n**2 for n in range(1, 6)}
print(quadrados_dict)  # {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# Inverter dicionário
original = {"a": 1, "b": 2, "c": 3}
invertido = {v: k for k, v in original.items()}
print(invertido)  # {1: 'a', 2: 'b', 3: 'c'}

# Filtrar dicionário
precos = {"maçã": 3.5, "banana": 2.0, "uva": 8.5, "laranja": 4.0}
caros = {fruta: preco for fruta, preco in precos.items() if preco > 4}
print(caros)  # {'uva': 8.5}

# Criar dicionário de frutas e tamanhos
frutas = ["maçã", "banana", "uva"]
tamanhos = {fruta: len(fruta) for fruta in frutas}
print(tamanhos)  # {'maçã': 4, 'banana': 6, 'uva': 3}

🔗 Generator Expressions (Bônus)

Parecido com list comprehension, mas com parênteses. Retorna um generator (lazy evaluation):

# List comprehension - cria lista inteira na memória
lista = [x ** 2 for x in range(1000000)]  # Usa ~8MB

# Generator expression - calcula sob demanda
gerador = (x ** 2 for x in range(1000000))  # Usa ~100 bytes

# Útil para grandes volumes de dados
soma = sum(x ** 2 for x in range(1000000))

# Usar com funções que aceitam iteráveis
print(max(x for x in range(100) if x % 7 == 0))  # 98
print(any(x > 50 for x in range(100)))  # True

💡 Quando NÃO Usar List Comprehension

Embora poderosas, list comprehensions nem sempre são a melhor escolha:

❌ Evite em:

  • Lógica muito complexa: Se precisa de muitas linhas, use loop tradicional
  • Efeitos colaterais: Como imprimir, salvar em arquivo ou modificar variáveis externas
  • Múltiplas operações: Quando cada elemento precisa de várias transformações
  • Depuração difícil: Loops tradicionais são mais fáceis de debugar
# ❌ MAU uso - muito complexo
resultado = [
    item.upper().strip().replace(" ", "_") 
    for sublist in dados 
    for item in sublist 
    if len(item) > 3 and item.startswith("a") 
    if not item.endswith("z")
]

# ✅ BOM - usar loop tradicional
resultado = []
for sublist in dados:
    for item in sublist:
        if len(item) > 3 and item.startswith("a"):
            if not item.endswith("z"):
                processado = item.upper().strip().replace(" ", "_")
                resultado.append(processado)

📚 Exemplos Avançados do Mundo Real

# 1. Validar e-mails
emails = [
    "[email protected]",
    "invalido.com",
    "[email protected]",
    "sem_arroba"
]
validos = [email for email in emails if "@" in email and "." in email]
print(validos)  # ['[email protected]', '[email protected]']

# 2. Extrair números de strings
textos = ["Produto123", "Item456", "Código789"]
numeros = [int(''.join(c for c in texto if c.isdigit())) for texto in textos]
print(numeros)  # [123, 456, 789]

# 3. Criar slug de URLs
titulos = ["Aprenda Python", "Guia de Django", "Tutorial Flask"]
slugs = [titulo.lower().replace(" ", "-") for titulo in titulos]
print(slugs)  # ['aprenda-python', 'guia-de-django', 'tutorial-flask']

# 4. Filtrar arquivos por extensão
arquivos = ["doc.pdf", "imagem.jpg", "codigo.py", "video.mp4", "script.py"]
arquivos_py = [arquivo for arquivo in arquivos if arquivo.endswith(".py")]
print(arquivos_py)  # ['codigo.py', 'script.py']

# 5. Processar JSON
import json

usuarios_json = [
    '{"nome": "Ana", "idade": 25}',
    '{"nome": "Bruno", "idade": 30}',
    '{"nome": "Carla", "idade": 28}'
]

usuarios = [json.loads(u) for u in usuarios_json]
maiores_de_26 = [u["nome"] for u in usuarios if u["idade"] > 26]
print(maiores_de_26)  # ['Bruno', 'Carla']

🎓 Boas Práticas

  1. Mantenha simples: Se passa de uma linha, considere usar loop tradicional
  2. Use nomes descritivos: [aluno for aluno in turma] é melhor que [a for a in t]
  3. Priorize legibilidade: Código claro > código curto
  4. Use quebra de linha: Para comprehensions longas, quebre em múltiplas linhas
  5. Evite aninhamento excessivo: Máximo 2 níveis de for
# ✅ BOM - quebrado em múltiplas linhas
resultado = [
    processar_item(item)
    for item in lista_grande
    if validar_item(item)
]

# ✅ BOM - usar variáveis intermediárias
dados_filtrados = [d for d in dados if d > 0]
dados_processados = [processar(d) for d in dados_filtrados]

🚀 Próximos Passos

Agora que você domina list comprehensions, continue sua jornada Python:

Quer se tornar um expert em Python? Confira nosso curso completo de Python do zero ao avançado com projetos práticos, exercícios interativos e certificado reconhecido pelo mercado!

📝 Resumo

Neste guia completo sobre list comprehensions, você aprendeu:

  • ✅ Sintaxe básica e como criar listas de forma concisa
  • ✅ Filtrar elementos com condições if
  • ✅ Usar if-else para transformações condicionais
  • ✅ List comprehensions aninhadas para estruturas complexas
  • ✅ Set e dict comprehensions
  • ✅ Generator expressions para economia de memória
  • ✅ Boas práticas e quando evitar comprehensions
  • ✅ Projetos práticos do mundo real

List comprehensions são uma ferramenta essencial no arsenal de qualquer desenvolvedor Python. Domine essa técnica e seu código será mais pythônico, eficiente e elegante!