✅ Artigo atualizado em Setembro 2026 (Python 3.x) Nova resposta rápida com as três formas (básica, com
ife comif/else), 12 exemplos prontos para copiar, erros comuns com traceback e 8 exercícios resolvidos. Benchmarks conferidos novamente.
Resposta rápida
Uma list comprehension (compreensão de lista) cria uma lista nova a partir de um iterável em uma linha: [expr for item in iteravel]. Para filtrar, o if vai no fim. Para escolher entre dois valores, o if/else (ternário) vem antes do for.
1
2
3
4
numeros = [1, 2, 3, 4, 5]
[n * 10 for n in numeros] # [10, 20, 30, 40, 50]
[n for n in numeros if n % 2 == 0] # [2, 4]
['par' if n % 2 == 0 else 'ímpar' for n in numeros] # ['ímpar', 'par', 'ímpar', 'par', 'ímpar']
Resumo em 30 segundos:
-
ifsozinho é filtro e fica depois dofor;if/elseescolhe o valor e fica antes dofor. -
elsedepois dofordáSyntaxError. - Colchetes geram lista; chaves geram set (ou dict, com
chave: valor); parênteses geram um generator. - Em transformações simples, costuma ser um pouco mais rápida que
for+append()(cerca de 10% nos testes abaixo). - A lista original não muda: a comprehension sempre devolve uma lista nova.
Olá Pythonista!
List Comprehensions são uma das features mais elegantes e poderosas do Python. Elas permitem criar e transformar listas de forma concisa, legível e geralmente mais rápida que loops tradicionais.
Neste guia completo, você vai aprender:
- ✅ Sintaxe e padrões de list comprehensions
- ✅ Benchmarks reais de performance
- ✅ Comparação Generator vs List (memória)
- ✅ Casos de uso do mundo real
- ✅ Quando NÃO usar (legibilidade)
O que é uma list comprehension? Uma list comprehension (compreensão de listas) é uma sintaxe concisa do Python para criar uma nova lista a partir de um iterável em uma única expressão, no formato [expr for item in iteravel]. Ela aplica uma transformação (expr) a cada elemento e, opcionalmente, filtra com if, substituindo um laço for com append() por uma linha mais legível e idiomática. É o equivalente, para listas, das set comprehensions e dict comprehensions.
Ah, você sabia que o mesmo conceito pode ser aplicado aos dicionários (dict) e conjuntos (set) do Python?
Já abre o post sobre Dict Comprehensions (e set comprehensions) em outra aba e corre pra lá quando terminar aqui! ![]()
Vá Direto ao Assunto…
- Listas em Python
- List Comprehensions (Compreensão de Listas)
- Performance: List Comprehension vs For Loop
- List Comprehensions com if
- List Comprehensions com vários if’s
- List Comprehensions com if + else
- Múltiplas List Comprehensions (aninhadas)
- Exemplos de List Comprehension em Python
- Generator Expression vs List Comprehension
- Casos de Uso do Mundo Real
- Quando NÃO Usar List Comprehensions
- Erros comuns
- Exercícios resolvidos
Listas em Python
Lista é uma estrutura de dados provida pela própria linguagem e que utilizamos muito na programação Python.
Saber como manuseá-las corretamente, otimizando seu código e tirando maior proveito daquilo que o Python nos proporciona, é sempre uma boa ideia. Se quiser revisar o básico antes, veja nosso guia completo de Listas no Python.
Os seguintes métodos estão disponíveis em uma lista:
-
list.append(x): Adiciona um item ao fim da lista. -
list.extend(iterable): Adiciona todos os itens do iterável iterable ao fim da lista. -
list.insert(i, x): Insere um item em uma dada posição i. -
list.remove(x): Remove o primeiro elemento, cujo valor seja x. -
list.pop(i): Remove o item de posição i da lista e o retorna. Caso i não seja especificado, retorna o último elemento da lista. -
list.clear(): Remove todos os elementos da lista. -
list.index(x[, start[, end]]): Retorna o índice do primeiro elemento cujo valor seja x. -
list.count(x): Retorna o número de vezes que o valor x aparece na lista. -
list.sort(key=None, reverse=False): Ordena os items da lista (os argumentos podem ser usados para customizar a ordenação). -
list.reverse(): Reverte os elementos da lista. -
list.copy(): Retorna uma lista com a cópia dos elementos da lista de origem.
Em Python, utilizamos colchetes para criação de listas. Exemplo:
1
2
3
4
5
# Apenas números
lista_numerica = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# Letras e números
lista_alfanumerica = ['a', 'b', 'c', 1, 2, 3]
List Comprehensions (Compreensão de Listas)
Uma list comprehension cria uma lista inteira em uma única linha, aplicando uma expressão a cada item de um iterável. Foi concebida na PEP 202 e também está documentada na documentação oficial do Python.
Sua sintaxe básica é:
1
[expr for item in lista]
Em outras palavras: aplique a expressão expr em cada item da lista. É o mesmo for das estruturas de repetição, só que escrito dentro dos colchetes.
Exemplo: dado o seguinte código:
1
2
for item in range(10):
lista.append(item**2)
Podemos reescrevê-lo, utilizando list comprehensions, da seguinte forma:
1
lista = [item**2 for item in range(10)]
Ou seja: aplique a potência de 2 em todos os itens da lista.
Outro Exemplo: dado o seguinte código, que transforma os itens da lista em maiúsculos:
1
2
for item in lista:
resultado.append(str(item).upper())
Podemos reescrevê-lo da seguinte forma:
1
resultado = [str(item).upper() for item in lista]
Performance: List Comprehension vs For Loop
Em transformações simples, a list comprehension costuma ser mais rápida que o for com append() - porque evita as repetidas chamadas ao método append e roda em bytecode otimizado pelo interpretador.
A tabela abaixo resume as três formas mais comuns de transformar uma lista:
| Abordagem | Código | Resultado | Quando usar |
|---|---|---|---|
| For loop |
r = []for x in lista: r.append(x**2)
|
Lista materializada | Lógica complexa, side effects, debug |
| List comprehension | [x**2 for x in lista] |
Lista materializada | Transformação/filtro simples (mais legível e rápida) |
map() / filter() |
map(lambda x: x**2, lista) |
Iterador lazy | Aplicar função existente; converter com list(...)
|
💡
map()efilter()retornam um iterador preguiçoso (não uma lista); só produzem os valores quando consumidos. Para a maioria dos casos do dia a dia, a list comprehension é mais legível quemapefiltercom funçõeslambda.
Benchmark 1: Criação de Lista Simples
Vamos comparar criar uma lista com os quadrados de 10.000 números:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import timeit
# Setup: dados de teste
setup = "data = range(10000)"
# Método 1: For loop tradicional
for_loop = """
result = []
for x in data:
result.append(x**2)
"""
# Método 2: List comprehension
list_comp = "[x**2 for x in data]"
# Executar 1000 vezes e medir tempo
time_loop = timeit.timeit(for_loop, setup, number=1000)
time_comp = timeit.timeit(list_comp, setup, number=1000)
print(f"For loop: {time_loop:.4f}s")
print(f"List comprehension: {time_comp:.4f}s")
print(f"List comp é {time_loop/time_comp:.2f}x mais rápida!")
Resultado (exemplo - Python 3.10):
1
2
3
For loop: 2.1426s
List comprehension: 1.9049s
List comp é 1.12x mais rápida!
ℹ️ Os números absolutos variam conforme máquina e versão do Python - rode o código aí na sua para ver os seus. O importante é a tendência: para transformações simples, a list comprehension costuma vencer o
for+append().
Por que List Comprehensions são mais rápidas?
- Otimização do interpretador: Python detecta list comprehensions e otimiza bytecode
-
Menos chamadas de função:
append()é chamado toda iteração no loop - Alocação de memória: List comprehension pre-aloca espaço quando possível
Benchmark 2: Filtragem e Transformação
Vamos filtrar números pares e elevar ao quadrado:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import timeit
setup = "data = range(10000)"
# For loop com if
for_loop_if = """
result = []
for x in data:
if x % 2 == 0:
result.append(x**2)
"""
# List comprehension com if
list_comp_if = "[x**2 for x in data if x % 2 == 0]"
time_loop = timeit.timeit(for_loop_if, setup, number=1000)
time_comp = timeit.timeit(list_comp_if, setup, number=1000)
print(f"For loop com if: {time_loop:.4f}s")
print(f"List comp com if: {time_comp:.4f}s")
print(f"Diferença: {((time_loop - time_comp) / time_loop * 100):.1f}% mais rápido")
Resultado (exemplo - Python 3.10):
1
2
3
For loop com if: 1.4450s
List comp com if: 1.2851s
Diferença: 11.1% mais rápido
💡 Dica Pro: List comprehensions também levam vantagem em operações com filtros (
if). A margem exata depende da máquina e da versão do Python, mas a versão concisa tende a ser mais rápida.
Está curtindo esse conteúdo? ![]()
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
List Comprehensions com if
Para filtrar elementos, basta adicionar um if ao final da list comprehension: só os itens que satisfazem a condição entram na nova lista.
Sua sintaxe básica é:
1
[expr for item in lista if cond]
Ou seja: aplique a expressão expr em cada item da lista caso a condição cond seja satisfeita.
Vamos criar algumas listas utilizando condições.
Por exemplo, podemos retirar os números ímpares de um conjunto de número da seguinte forma:
1
resultado = [numero for numero in range(20) if numero % 2 == 0]
O que resulta em:
1
resultado = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
Vamos ver como fica com vários if’s.
List Comprehensions com vários if’s
Você pode encadear vários if em sequência: o item só entra na lista se todas as condições forem verdadeiras (equivale a uni-las com and).
Por exemplo: gostaríamos de saber os Múltiplos Comuns de 5 e 6.
Utilizando múltiplos if's e list comprehensions, podemos criar o seguinte código:
1
resultado = [numero for numero in range(100) if numero % 5 == 0 if numero % 6 == 0]
Ou seja, o número só será passado para lista resultado caso sua divisão por 5 E por 6 seja igual à zero.
O resultado do código acima será:
1
resultado = [0, 30, 60, 90]
List Comprehensions com if + else
Quando você precisa escolher entre dois valores (em vez de só filtrar), use o if/else ternário antes do for. Repare na posição: com filtro o if vai no fim; com if/else ele vai no começo.
A sintaxe básica para essa construção é:
1
[resultado_if if expr else resultado_else for item in lista]
Em outras palavras: para cada item da lista, aplique o resultado resultado_if se a expressão expr for verdadeira,
caso contrário, aplique resultado_else. Esse trecho antes do for é a expressão condicional (ternário) que você já usa fora das comprehensions (veja estruturas condicionais no Python).
Por exemplo, queremos criar uma lista que contenha “1” quando determinado número for múltiplo de 5 e “0” caso contrário.
Podemos codificá-lo da seguinte forma:
1
resultado = ['1' if numero % 5 == 0 else '0' for numero in range(16)]
Dessa forma, teremos o seguinte resultado:
1
resultado = ['1', '0', '0', '0', '0', '1', '0', '0', '0', '0', '1', '0', '0', '0', '0', '1']
Onde vai o if? Use esta tabela para decidir:
| Você quer | Sintaxe | Exemplo (com nums = [1, 2, 3, 4]) |
Resultado |
|---|---|---|---|
| Transformar todos os itens | [expr for x in nums] |
[x * 10 for x in nums] |
[10, 20, 30, 40] |
| Filtrar (só alguns entram) | [expr for x in nums if cond] |
[x for x in nums if x > 2] |
[3, 4] |
| Escolher entre dois valores (todos entram) | [a if cond else b for x in nums] |
[x if x > 2 else 0 for x in nums] |
[0, 0, 3, 4] |
| Escolher e filtrar ao mesmo tempo | [a if c1 else b for x in nums if c2] |
['par' if x % 2 == 0 else 'ímpar' for x in nums if x > 1] |
['par', 'ímpar', 'par'] |
Estou desenvolvendo o Ebookr.ai, uma plataforma que transforma suas ideias em ebooks profissionais usando IA - com geração de capa, infográficos e exportação em PDF. Te convido a conhecer!
Múltiplas List Comprehensions (aninhadas)
Para estruturas em duas dimensões, você pode aninhar uma list comprehension dentro da outra - o caso clássico é transpor uma matriz.
É aqui que a brincadeira fica séria!
Pra quem não lembra: transpor uma matriz significa transformar as linhas em colunas e vice-versa.
Ou seja, dada a seguinte matriz:
1
2
3
4
5
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
Queremos o seguinte resultado:

Em Python, podemos fazer isso da seguinte forma:
1
2
3
4
5
6
7
8
9
transposta = []
matriz = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
for i in range(len(matriz[0])):
linha_transposta = []
for linha in matriz:
linha_transposta.append(linha[i])
transposta.append(linha_transposta)
A matriz transposta conteria:
1
transposta = [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
Podemos reescrever o código acima, de transposição de matrizes, da seguinte forma, utilizando list comprehension:
1
2
matriz = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
transposta = [[linha[i] for linha in matriz] for i in range(4)]
No código acima:
- No primeiro loop,
iassume o valor de 0, portanto[linha[0] for linha in matriz]vai retornar o primeiro elemento de cada linha:[1, 5, 9] - No segundo loop,
iassume o valor de 1, portanto[linha[1] for linha in matriz]vai retornar o segundo elemento de cada linha:[2, 6, 10] - No terceiro loop,
iassume o valor de 2, portanto[linha[2] for linha in matriz]vai retornar o terceiro elemento de cada linha:[3, 7, 11] - No quarto loop,
iassume o valor de 3, portanto[linha[3] for linha in matriz]vai retornar o quarto elemento de cada linha:[4, 8, 12]
Obtendo, assim, o mesmo resultado: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]].
Exemplos de List Comprehension em Python
12 exemplos curtos, prontos para copiar. A saída de cada linha está no comentário.
Números e filtros:
1
2
3
4
5
6
7
8
9
valores = [4, -2, 0, 7, -5]
positivos = [v for v in valores if v > 0] # [4, 7]
notas = [8.5, 6.0, 7.0, 4.5]
situacao = ['aprovado' if n >= 7 else 'reprovado' for n in notas]
# ['aprovado', 'reprovado', 'aprovado', 'reprovado']
dados = ['ana', '', None, 'bia', '']
preenchidos = [d for d in dados if d] # ['ana', 'bia']
Strings:
1
2
3
4
5
6
7
8
9
10
nomes = [' ana silva', 'BRUNO costa ', 'carla ']
limpos = [nome.strip().title() for nome in nomes] # ['Ana Silva', 'Bruno Costa', 'Carla']
frase = 'list comprehension deixa o código mais limpo'
tamanhos = [len(palavra) for palavra in frase.split()] # [4, 13, 5, 1, 6, 4, 5]
# Ler números de uma string (ex.: o que vem do input())
numeros = [int(x) for x in '10 20 30'.split()] # [10, 20, 30]
digitos = [int(c) for c in 'a1b2c3' if c.isdigit()] # [1, 2, 3]
💡 Em exercícios que leem vários números na mesma linha, o padrão é
[int(x) for x in input().split()].
Listas de listas, zip, enumerate e dicionários:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
matriz = [[1, 2], [3, 4], [5, 6]]
achatada = [x for linha in matriz for x in linha] # [1, 2, 3, 4, 5, 6]
a = [1, 2, 3]
b = [10, 20, 30]
somas = [x + y for x, y in zip(a, b)] # [11, 22, 33]
frutas = ['maçã', 'banana', 'uva']
numeradas = [f'{i}. {fruta}' for i, fruta in enumerate(frutas, start=1)]
# ['1. maçã', '2. banana', '3. uva']
precos = {'café': 12.5, 'pão': 0.8, 'leite': 5.9}
baratos = [produto for produto, preco in precos.items() if preco < 10] # ['pão', 'leite']
etiquetas = [f'{k}: R$ {v:.2f}' for k, v in precos.items()]
# ['café: R$ 12.50', 'pão: R$ 0.80', 'leite: R$ 5.90']
Repare na ordem dos for ao achatar: é a mesma de dois laços aninhados escritos normalmente (primeiro for linha in matriz, depois for x in linha).
Generator Expression vs List Comprehension
A diferença prática é a memória: a list comprehension (colchetes) materializa todos os valores de uma vez, enquanto a generator expression (parênteses) é lazy e produz um valor por vez, sob demanda.
Sintaxe: Parênteses vs Colchetes
1
2
3
4
5
# List Comprehension (colchetes) - carrega tudo na memória
lista = [x**2 for x in range(1000000)]
# Generator Expression (parênteses) - lazy evaluation
generator = (x**2 for x in range(1000000))
Comparação de Memória
Vamos medir o consumo de memória de cada abordagem:
1
2
3
4
5
6
7
8
9
10
11
12
13
import sys
# Lista: armazena TODOS os 1 milhão de valores
lista = [x**2 for x in range(1000000)]
print(f"Lista: {sys.getsizeof(lista):,} bytes ({sys.getsizeof(lista) / 1024 / 1024:.2f} MB)")
# Generator: armazena apenas o estado atual
generator = (x**2 for x in range(1000000))
print(f"Generator: {sys.getsizeof(generator):,} bytes ({sys.getsizeof(generator) / 1024:.4f} KB)")
# Diferença
diferenca = sys.getsizeof(lista) / sys.getsizeof(generator)
print(f"\nLista usa {diferenca:,.0f}x MAIS memória!")
Resultado (exemplo - CPython 64 bits):
1
2
3
4
Lista: 8,448,728 bytes (8.06 MB)
Generator: 104 bytes (0.1016 KB)
Lista usa 81,238x MAIS memória!
ℹ️ O tamanho do generator é constante (~104 bytes) independentemente de processar mil ou um bilhão de itens - é justamente aí que mora a economia de memória. O número exato varia com a plataforma/versão do Python.
Quando Usar Cada Um?
Use List Comprehension quando:
- ✅ Você precisa acessar os valores múltiplas vezes
- ✅ Precisa de indexação (
lista[5]) - ✅ Precisa dos métodos de lista (
len(),sort(),reverse()) - ✅ O dataset é pequeno (< 10.000 itens)
Use Generator quando:
- ✅ Você vai iterar apenas uma vez
- ✅ O dataset é grande ou infinito
- ✅ Quer economizar memória
- ✅ Processa streams de dados (logs, arquivos, APIs)
Exemplo Prático: Processar Arquivo Grande
1
2
3
4
5
6
7
8
9
10
11
# ❌ RUIM: Carrega arquivo inteiro na memória (pode estourar RAM)
with open('gigante.log') as arquivo:
linhas = [linha.strip().upper() for linha in arquivo]
for linha in linhas:
processar(linha)
# ✅ BOM: Processa linha por linha (memória constante)
with open('gigante.log') as arquivo:
linhas = (linha.strip().upper() for linha in arquivo)
for linha in linhas:
processar(linha) # Processa uma de cada vez
💡 Regra de Ouro: Se você iterar apenas uma vez, use generator. Se precisar acessar múltiplas vezes, use list.
List comprehensions são um baita salto de produtividade, mas o ganho de verdade aparece quando você já programa com fluência em funções, listas e dicionários. Essa fluência é o que a Jornada Python constrói, do zero:
Casos de Uso do Mundo Real
Vamos ver exemplos práticos que você pode usar no dia a dia:
1. Limpeza de Dados CSV
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import csv
# Ler CSV e limpar dados em uma linha
with open('usuarios.csv') as f:
reader = csv.DictReader(f)
# Remove espaços e converte emails para minúsculas
usuarios_limpos = [
{
'nome': row['nome'].strip(),
'email': row['email'].lower().strip(),
'idade': int(row['idade'])
}
for row in reader
if row['email'] # Ignora linhas sem email
]
2. Processar Resposta de API (JSON)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
# Buscar repos do GitHub e extrair informações
response = requests.get('https://api.github.com/users/python/repos')
repos = response.json()
# Extrair apenas nome e estrelas dos repos com mais de 100 stars
repos_populares = [
{'nome': repo['name'], 'stars': repo['stargazers_count']}
for repo in repos
if repo['stargazers_count'] > 100
]
print(repos_populares)
# [{'nome': 'cpython', 'stars': ...}, ...] (os valores mudam com o tempo)
3. Filtrar DataFrames (Pandas)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import pandas as pd
# Criar DataFrame
df = pd.DataFrame({
'produto': ['A', 'B', 'C', 'D', 'E'],
'preco': [10, 25, 15, 30, 12],
'estoque': [100, 0, 50, 200, 5]
})
# Produtos disponíveis (estoque > 0) e baratos (< 20)
produtos_validos = [
row['produto']
for _, row in df.iterrows()
if row['estoque'] > 0 and row['preco'] < 20
]
print(produtos_validos) # ['A', 'C', 'E']
4. Flatten (Achatar) Lista de Listas
1
2
3
4
5
6
7
8
9
# Lista aninhada
matriz = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# Achatar em uma única lista
flat = [item for sublista in matriz for item in sublista]
print(flat) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
# Ou com sum (menos eficiente)
flat = sum(matriz, [])
5. Combinar Múltiplas Listas (Zip)
1
2
3
4
5
6
7
8
9
10
11
12
nomes = ['Ana', 'Bruno', 'Carlos']
idades = [25, 30, 28]
cidades = ['SP', 'RJ', 'MG']
# Criar dicionário com todos os dados
pessoas = [
{'nome': n, 'idade': i, 'cidade': c}
for n, i, c in zip(nomes, idades, cidades)
]
print(pessoas)
# [{'nome': 'Ana', 'idade': 25, 'cidade': 'SP'}, ...]
Quando NÃO Usar List Comprehensions
List comprehensions são poderosas, mas podem prejudicar legibilidade quando mal usadas.
❌ Exemplo RUIM: Muito Complexo
1
2
3
4
5
6
# ❌ NÃO FAÇA ISSO - Ilegível!
resultado = [
{'usuario': u['nome'], 'total': sum(c['valor'] for c in u['compras'] if c['status'] == 'aprovado')}
for u in usuarios
if u['ativo'] and len([c for c in u['compras'] if c['status'] == 'aprovado']) > 0
]
Problema: Muito aninhamento, dificulta debug e manutenção.
✅ Solução: Quebrar em Etapas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ✅ FAÇA ISSO - Legível e testável!
def calcular_total_aprovado(usuario):
"""Calcula total de compras aprovadas do usuário"""
compras_aprovadas = [c['valor'] for c in usuario['compras'] if c['status'] == 'aprovado']
return sum(compras_aprovadas)
def usuario_valido(usuario):
"""Verifica se usuário está ativo e tem compras aprovadas"""
return usuario['ativo'] and calcular_total_aprovado(usuario) > 0
# Agora fica claro e testável
resultado = [
{'usuario': u['nome'], 'total': calcular_total_aprovado(u)}
for u in usuarios
if usuario_valido(u)
]
Regras de Legibilidade
✅ Use list comprehensions quando:
- Cabe em 1-2 linhas (máx 79-100 caracteres)
- A lógica é simples (1 filtro, 1 transformação)
- Não precisa de debug complexo
❌ Evite list comprehensions quando:
- Tem múltiplos níveis de aninhamento
- Lógica complexa com vários
if/else - Você precisa imprimir valores intermediários (debug)
- Usa side effects (modificar variáveis externas, I/O)
Exemplo: Quando Usar For Loop Normal
1
2
3
4
5
6
7
8
9
# ❌ RUIM: Side effect em list comprehension
[print(x) for x in lista] # NÃO FAÇA ISSO!
# ✅ BOM: For loop quando precisa side effects
for x in lista:
print(x)
log.info(f'Processando {x}')
if x > 100:
enviar_alerta(x)
💡 Lembre-se: Código legível é mais importante que código conciso. Se alguém vai demorar 5 minutos para entender sua list comprehension, use um loop normal!
Erros comuns
1. Colocar o else depois do for
1
pares = [n for n in range(5) if n % 2 == 0 else 0]
1
SyntaxError: invalid syntax
O if do fim é só filtro e não aceita else. Se você quer um valor alternativo, mova o ternário para antes do for: [n if n % 2 == 0 else 0 for n in range(5)] resulta em [0, 0, 2, 0, 4]. Se só quer filtrar, apague o else.
2. Usar if sem else antes do for
1
positivos = [n if n > 0 for n in [1, -2, 3]]
1
SyntaxError: expected 'else' after 'if' expression
Antes do for, o if é um ternário e precisa de else. Para filtrar, leve o if para o fim: [n for n in [1, -2, 3] if n > 0] resulta em [1, 3].
3. Inverter a ordem dos for ao achatar uma lista
1
2
matriz = [[1, 2], [3, 4]]
planos = [x for x in linha for linha in matriz]
1
NameError: name 'linha' is not defined
Os for seguem a ordem dos laços aninhados: primeiro o de fora. O correto é [x for linha in matriz for x in linha], que resulta em [1, 2, 3, 4].
4. Usar parênteses achando que criou uma lista
1
2
quadrados = (x**2 for x in range(3))
print(quadrados[0])
1
TypeError: 'generator' object is not subscriptable
Parênteses criam uma generator expression, que não aceita índice. Use colchetes ([x**2 for x in range(3)]) ou converta com list(...).
5. Converter números separados por vírgula com split() sem argumento
1
numeros = [int(x) for x in '1, 2, 3'.split()]
1
ValueError: invalid literal for int() with base 10: '1,'
Sem argumento, split() separa só por espaços e a vírgula fica grudada no número. Use '1, 2, 3'.split(','): o int() já ignora os espaços em volta, e o resultado é [1, 2, 3].
Exercícios resolvidos
Exercício 1. Crie, com list comprehension, uma lista com os cubos dos números de 1 a 5.
Ver solução
1
2
cubos = [n**3 for n in range(1, 6)]
print(cubos)
Saída: [1, 8, 27, 64, 125]
range(1, 6) vai de 1 até 5 (o fim não entra), e n**3 eleva cada número ao cubo.
Exercício 2. (Questão de prova) Qual código representa uma list comprehension que gera os quadrados de 0 a 4?
a) {x**2 for x in range(5)}
b) [x*2 for x in range(5)]
c) [x**2 for x in range(5)]
d) [x**2 for x in range(4)]
Ver solução
1
print([x**2 for x in range(5)])
Saída: [0, 1, 4, 9, 16]
Resposta: c. A alternativa a) usa chaves e gera um set, a b) calcula o dobro ([0, 2, 4, 6, 8]) e a d) para no 3 ([0, 1, 4, 9]).
Exercício 3. A partir da frase 'o rato roeu a roupa do rei de roma', gere uma lista com as palavras de mais de 3 letras, em maiúsculas.
Ver solução
1
2
3
frase = 'o rato roeu a roupa do rei de roma'
palavras = [p.upper() for p in frase.split() if len(p) > 3]
print(palavras)
Saída: ['RATO', 'ROEU', 'ROUPA', 'ROMA']
O if no fim filtra as palavras e o p.upper() transforma só as que passaram no filtro.
Exercício 4. (Questão de prova) Qual linha é válida e gera ['par', 'ímpar', 'par', 'ímpar']?
a) ['par' for n in range(4) if n % 2 == 0 else 'ímpar']
b) ['par' if n % 2 == 0 else 'ímpar' for n in range(4)]
c) ['par' if n % 2 == 0 for n in range(4) else 'ímpar']
d) [n % 2 == 0 ? 'par' : 'ímpar' for n in range(4)]
Ver solução
1
print(['par' if n % 2 == 0 else 'ímpar' for n in range(4)])
Saída: ['par', 'ímpar', 'par', 'ímpar']
Resposta: b. A a) é o erro clássico do else depois do for e dá SyntaxError: invalid syntax; a c) quebra o ternário ao meio (SyntaxError: expected 'else' after 'if' expression); a d) usa o operador ? : de C/Java, que não existe em Python.
Exercício 5. Dada a lista de temperaturas [3, -1, 7, -5, 0], troque os valores negativos por 0, mantendo os demais.
Ver solução
1
2
3
temperaturas = [3, -1, 7, -5, 0]
ajustadas = [t if t > 0 else 0 for t in temperaturas]
print(ajustadas)
Saída: [3, 0, 7, 0, 0]
Todos os itens continuam na lista, só muda o valor: por isso é if/else antes do for, e não um filtro no fim.
Exercício 6. O usuário digitou '4,8,15,16,23,42'. Gere uma lista de inteiros só com os números pares.
Ver solução
1
2
3
entrada = '4,8,15,16,23,42'
pares = [int(x) for x in entrada.split(',') if int(x) % 2 == 0]
print(pares)
Saída: [4, 8, 16, 42]
split(',') separa o texto em pedaços, int(x) converte cada pedaço e o if mantém só os pares.
Exercício 7. Achate a lista [[1, 2], [3, 4], [5, 6]] e mantenha apenas os números pares.
Ver solução
1
2
3
matriz = [[1, 2], [3, 4], [5, 6]]
pares = [x for linha in matriz for x in linha if x % 2 == 0]
print(pares)
Saída: [2, 4, 6]
Primeiro o for de fora (as linhas), depois o de dentro (os números de cada linha) e, por último, o filtro.
Exercício 8. (Questão de prova) O que o código abaixo imprime?
1
print([x for x in range(10) if x % 3 == 0 if x % 2 == 0])
a) [0, 6]
b) [0, 3, 6, 9]
c) [0, 2, 3, 4, 6, 8, 9]
d) SyntaxError
Ver solução
Saída: [0, 6]
Resposta: a. Dois if seguidos funcionam como and: o número precisa ser múltiplo de 3 e de 2 ao mesmo tempo. A c) seria o resultado de um or.
Quer praticar isso com projetos guiados, do básico ao avançado? Conheça o nosso curso de Python completo, a Jornada Python.
Conclusão
Neste guia completo sobre List Comprehensions, você aprendeu:
✅ Sintaxe e padrões - Do básico ao aninhamento
✅ Performance - List comprehensions costumam ser mais rápidas que loops for + append()
✅ Generator vs List - Memória constante (~104 bytes) vs lista materializada (vários MB)
✅ Casos de uso reais - CSV, APIs, Pandas, flatten, zip
✅ Onde vai o if - filtro no fim, if/else antes do for (e o SyntaxError quando se inverte)
✅ Quando NÃO usar - Legibilidade é mais importante que concisão
Principais lições:
- List comprehensions são rápidas e concisas para transformações simples
- Use generators para datasets grandes (economiza memória)
- Mantenha legibilidade - se está complexo demais, use loop normal
- Evite side effects em list comprehensions
Agora que você domina list comprehensions, use com sabedoria! Lembre-se: código legível é mais importante que código conciso.
Próximos passos:
- Pratique com seus próprios dados
- Aplique o mesmo conceito a dicionários e conjuntos em Dict Comprehensions (e set comprehensions)
- Experimente Generator Expressions em arquivos grandes
Então… Mão na massa!
![]()
Até o próximo post!
Perguntas frequentes
O que é uma list comprehension em Python?
Uma list comprehension é uma sintaxe concisa do Python para criar uma lista a partir de um iterável em uma única expressão, no formato [expr for item in iteravel]. Ela substitui um laço for com append() por uma linha mais legível e idiomática.
Qual a sintaxe básica de uma list comprehension?
A forma básica é [expr for item in iteravel], que aplica expr a cada item. Para filtrar, use [expr for item in iteravel if cond]. Exemplo: [x**2 for x in range(5)] resulta em [0, 1, 4, 9, 16].
Como usar if e else em uma list comprehension?
Com apenas if (filtro), ele vai ao final: [x for x in lista if x > 0]. Com if/else (escolha de valor), o ternário vem antes do for: [a if cond else b for item in lista]. Ex.: ['par' if n % 2 == 0 else 'impar' for n in range(3)].
Como fazer uma list comprehension aninhada para transpor uma matriz?
Use dois for: [[linha[i] for linha in matriz] for i in range(len(matriz[0]))]. Para [[1,2,3,4],[5,6,7,8],[9,10,11,12]] o resultado é [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]], trocando linhas por colunas.
List comprehension é mais rápida que um for loop?
Geralmente sim. A list comprehension costuma ser mais rápida que o for com append(), porque evita repetidas chamadas ao método append e usa bytecode otimizado. O ganho varia conforme máquina e versão do Python, mas a versão concisa tende a vencer em transformações simples.
Posso colocar o else depois do for em uma list comprehension?
Não. O else só existe junto com o if ternário, que fica antes do for: [x if x > 0 else 0 for x in lista]. Escrever [x for x in lista if x > 0 else 0] gera SyntaxError: invalid syntax. Se você só quer filtrar, use o if no fim e sem else: [x for x in lista if x > 0].
Qual código representa uma list comprehension que gera os quadrados de 0 a 4?
É [x**2 for x in range(5)], que resulta em [0, 1, 4, 9, 16]. Cuidado com as alternativas parecidas: {x**2 for x in range(5)} usa chaves e gera um set, [x*2 for x in range(5)] calcula o dobro e não o quadrado, e range(4) para no 3.
Qual a diferença entre list comprehension, set comprehension e generator expression?
Muda só o delimitador. Colchetes [x for x in dados] criam uma lista com todos os valores na memória. Chaves {x for x in dados} criam um set, sem repetidos e sem ordem garantida. Parênteses (x for x in dados) criam um generator, que produz um valor por vez e economiza memória, mas não aceita índice como g[0].
"Porque o Senhor dá a sabedoria, e da sua boca vem a inteligência e o entendimento" Pv 2:6