List Comprehensions no Python: if, else e exemplos

Cansado de programar?

Conheça a melhor e mais completa formação de Python e Django e sinta-se um programador verdadeiramente competente. Além de Python e Django, você também vai aprender Banco de Dados, SQL, HTML, CSS, Javascript, Bootstrap e muito mais!

Quero aprender Python e Django de Verdade! Quero aprender!
Suporte

Tire suas dúvidas diretamente com o professor

Projetos práticos

Projetos práticos voltados para o mercado de trabalho

Prática profissional

Formação moderna com foco na prática profissional

Download do Artigo

✅ Artigo atualizado em Setembro 2026 (Python 3.x) Nova resposta rápida com as três formas (básica, com if e com if/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:

  • if sozinho é filtro e fica depois do for; if/else escolhe o valor e fica antes do for.
  • else depois do for dá 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! :wink:

Vá Direto ao Assunto…

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() e filter() 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 que map e filter com funções lambda.

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?

  1. Otimização do interpretador: Python detecta list comprehensions e otimiza bytecode
  2. Menos chamadas de função: append() é chamado toda iteração no loop
  3. 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? :thumbsup:

Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?

Sua assinatura não pôde ser validada.
Você fez sua assinatura com sucesso.

Assine as PyDicas e receba 30 dias do melhor conteúdo Python na sua Caixa de Entrada: direto e sem enrolação!

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']

:bulb: 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:

Matriz Transposta

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, i assume 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, i assume 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, i assume 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, i assume 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:

  1. Cabe em 1-2 linhas (máx 79-100 caracteres)
  2. A lógica é simples (1 filtro, 1 transformação)
  3. Não precisa de debug complexo

❌ Evite list comprehensions quando:

  1. Tem múltiplos níveis de aninhamento
  2. Lógica complexa com vários if/else
  3. Você precisa imprimir valores intermediários (debug)
  4. 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:

Então… Mão na massa! :muscle: :muscle:

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].

Começe agora sua Jornada na Programação!

Não deixe para amanhã o sucesso que você pode começar a construir hoje!

#newsletter Olá :wave: Curtiu o artigo? Então faça parte da nossa Newsletter! Privacidade Não se preocupe, respeitamos sua privacidade. Você pode se descadastrar a qualquer momento.