Você já escreveu um for para criar uma lista nova, iterando sobre outra lista e aplicando alguma transformação? Todo mundo já. O Python oferece uma forma mais enxuta de fazer isso: as comprehensions.
Comprehensions são uma sintaxe que permite criar listas, dicionários e conjuntos em uma única linha de código, de forma legível e expressiva. Quando usadas com moderação, deixam o código mais limpo e direto ao ponto.
List comprehension
A forma básica funciona assim:
# Forma tradicional
numeros = [1, 2, 3, 4, 5]
dobrados = []
for n in numeros:
dobrados.append(n * 2)
# Comprehension
dobrados = [n * 2 for n in numeros]
# resultado: [2, 4, 6, 8, 10]
A sintaxe é [expressão for item in iterável]. Pense como uma frase: "para cada item no iterável, aplique a expressão e guarde o resultado".
Filtrando com condição
Você pode adicionar uma condição no final para filtrar elementos:
# Números pares de uma lista
pares = [n for n in range(20) if n % 2 == 0]
# resultado: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# Palavras com mais de 5 letras
palavras = ["python", "java", "javascript", "go", "ruby"]
longas = [p for p in palavras if len(p) > 5]
# resultado: ['python', 'javascript']
Transformando e filtrando ao mesmo tempo
Você pode combinar transformação e filtro:
# Dobrar apenas os números pares
resultado = [n * 2 for n in range(20) if n % 2 == 0]
# resultado: [0, 4, 8, 12, 16, 20, 24, 28, 32, 36]
Comprehensions aninhadas
Em casos simples, você pode usar um for dentro de outro:
# Achatando uma matriz
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [n for linha in matriz for n in linha]
# resultado: [1, 2, 3, 4, 5, 6, 7, 8, 9]
Cuidado: comprehension aninhada pode ficar difícil de ler. Se ficar confuso, prefira o for tradicional.
Dict comprehension
Funciona igual, mas cria um dicionário:
# Criar um dicionário de quadrados
quadrados = {n: n**2 for n in range(1, 6)}
# resultado: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
# Inverter um dicionário
origem = {"a": 1, "b": 2, "c": 3}
invertido = {v: k for k, v in origem.items()}
# resultado: {1: 'a', 2: 'b', 3: 'c'}
Filtrando dicionários
# Notas acima de 7
notas = {"Ana": 9, "Bia": 6, "Carlos": 8, "Davi": 5}
aprovados = {nome: nota for nome, nota in notas.items() if nota >= 7}
# resultado: {'Ana': 9, 'Carlos': 8}
Set comprehension
Cria um conjunto (sem duplicatas):
# Pegar letras únicas de uma string
texto = "abracadabra"
letras = {c for c in texto}
# resultado: {'a', 'b', 'c', 'd', 'r'}
Quando usar (e quando não usar)
Use quando:
- A lógica é simples e cabe em uma linha
- Você está criando uma lista/dict/set novo a partir de outro
- A comprehension é mais legível que o for equivalente
Não use quando:
- A lógica é complexa com múltiplas condições e transformações
- Você precisa de efeitos colaterais (como escrever em arquivo)
- A comprehension fica mais difícil de ler que o for tradicional
# Exemplo OK: simples e claro
quadrados = [n**2 for n in range(10)]
# Exemplo ruim: complexo demais para uma linha
resultado = [
transformar(a, b)
for a in dados
if a.valido
for b in a.filhos
if b.ativo and b.prioridade > 5
]
Resumo
| Tipo | Sintaxe | Resultado |
|---|---|---|
| List | [x for x in iterable] |
Lista |
| Dict | {k: v for k, v in iterable} |
Dicionário |
| Set | {x for x in iterable} |
Conjunto |
Comprehensions são uma das ferramentas que fazem Python ser tão expressivo. Depois que você pega o jeito, usa o tempo todo — e seu código fica mais limpo por conta disso.