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
- Mantenha simples: Se passa de uma linha, considere usar loop tradicional
- Use nomes descritivos:
[aluno for aluno in turma]é melhor que[a for a in t] - Priorize legibilidade: Código claro > código curto
- Use quebra de linha: Para comprehensions longas, quebre em múltiplas linhas
- 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:
- Funções em Python - Combine comprehensions com funções poderosas
- Dicionários em Python - Use dict comprehensions para estruturas avançadas
- Geradores e Iteradores - Aprenda lazy evaluation
- Programação Funcional - map, filter e reduce
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!