List Comprehension em Python: como usar com exemplos
Transforme 5 linhas de código em 1. Aprenda list comprehensions e escreva Python como um pythonista.
O jeito Python de criar listas
Se você já escreveu um for só para preencher uma lista, prepare-se: list comprehensions vão mudar sua vida.
# Jeito tradicional
quadrados = []
for n in range(10):
quadrados.append(n ** 2)
# Com list comprehension
quadrados = [n ** 2 for n in range(10)]
Mesmo resultado, uma linha. E não é só mais curto — é mais legível quando você se acostuma.
A sintaxe básica
[expressão for item in iterável]
É como ler em português: "para cada item no iterável, calcule a expressão".
nomes = ["ana", "pedro", "maria"]
maiusculos = [nome.upper() for nome in nomes]
# ['ANA', 'PEDRO', 'MARIA']
Adicionando condições
Você pode filtrar com if:
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Só os pares
pares = [n for n in numeros if n % 2 == 0]
# [2, 4, 6, 8, 10]
# Quadrados dos ímpares
quadrados_impares = [n ** 2 for n in numeros if n % 2 != 0]
# [1, 9, 25, 49, 81]
if/else na expressão
Quando você quer transformar todos os itens (sem filtrar), o if/else vai na expressão:
numeros = [1, 2, 3, 4, 5]
rotulos = ["par" if n % 2 == 0 else "ímpar" for n in numeros]
# ['ímpar', 'par', 'ímpar', 'par', 'ímpar']
Perceba a diferença:
- Filtro (só if): fica no final → [x for x in lista if condição]
- Transformação (if/else): fica na expressão → [a if condição else b for x in lista]
Comprehensions aninhadas
Para achatar uma lista de listas:
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
plana = [n for linha in matriz for n in linha]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]
Leia da esquerda para a direita: "para cada linha na matriz, para cada n na linha, pegue n".
Dict comprehensions
O mesmo conceito funciona para dicionários:
nomes = ["Python", "JavaScript", "Go"]
tamanhos = {nome: len(nome) for nome in nomes}
# {'Python': 6, 'JavaScript': 10, 'Go': 2}
E para inverter chave/valor:
original = {"a": 1, "b": 2, "c": 3}
invertido = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}
Set comprehensions
Para criar conjuntos (sem duplicatas):
frase = "banana"
letras = {letra for letra in frase}
# {'b', 'a', 'n'}
Quando NÃO usar
List comprehensions são ótimas, mas não force. Se a lógica fica complexa demais, um for tradicional é mais legível:
# Isso é difícil de ler — use um for normal
resultado = [
processa(item)
for sublista in dados
for item in sublista
if item.ativo
if item.valor > 100
]
A regra de ouro: se não cabe confortavelmente em uma linha, use um for.
Comparação de performance
List comprehensions são ligeiramente mais rápidas que loops com append:
import timeit
# Loop tradicional
def com_loop():
resultado = []
for i in range(1000):
resultado.append(i ** 2)
return resultado
# Comprehension
def com_comprehension():
return [i ** 2 for i in range(1000)]
# A comprehension é ~20-30% mais rápida
Isso acontece porque o Python otimiza a criação da lista internamente, sem precisar chamar .append() a cada iteração.
Resumo rápido
| Tipo | Sintaxe |
|---|---|
| Lista | [x for x in iterable] |
| Com filtro | [x for x in iterable if condição] |
| Com transformação | [a if cond else b for x in iterable] |
| Dicionário | {k: v for k, v in iterable} |
| Conjunto | {x for x in iterable} |
Agora você tem um superpoder. Use com sabedoria.