List comprehension é uma das features mais "pythônicas" da linguagem — uma forma concisa de criar listas a partir de iteráveis, com ou sem filtro. Além de mais elegante, geralmente é mais rápida que o loop equivalente. Dominar isso é um marco importante no aprendizado de Python.

Sintaxe básica

# Forma equivalente com loop:
quadrados = []
for n in range(1, 6):
    quadrados.append(n ** 2)

# Com list comprehension:
quadrados = [n ** 2 for n in range(1, 6)]
# [1, 4, 9, 16, 25]

Leitura: "crie uma lista de n ao quadrado, para cada n de 1 a 5."

Com filtro (condição)

valores = [120, 450, 89, 1200, 340, 5600, 230]

# Apenas os maiores que 300:
acima_300 = [v for v in valores if v > 300]
# [450, 1200, 5600, 340]  -- aguarda, aqui seria [450, 1200, 340, 5600]

# Transformação + filtro:
pares_dobrados = [n * 2 for n in range(10) if n % 2 == 0]
# [0, 4, 8, 12, 16]

Com expressão condicional (ternário)

valores = [1200, 450, 8900, 320, 5600]
categorias = ["Premium" if v >= 1000 else "Standard" for v in valores]
# ["Premium", "Standard", "Premium", "Standard", "Premium"]

Aninhado: listas de listas

matriz = [[1,2,3],[4,5,6],[7,8,9]]
# Achatar (flatten) a matriz em uma lista:
plana = [elemento for linha in matriz for elemento in linha]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

Dict comprehension

vendedores = ["Ana", "Bruno", "Carlos"]
metas = [50000, 40000, 60000]

# Criar dicionário vendedor -> meta:
metas_dict = {v: m for v, m in zip(vendedores, metas)}
# {"Ana": 50000, "Bruno": 40000, "Carlos": 60000}

# Inverter um dicionário:
invertido = {valor: chave for chave, valor in metas_dict.items()}

Set comprehension

estados = ["SP", "RJ", "SP", "MG", "RJ", "SP"]
# Valores únicos com set comprehension:
unicos = {e for e in estados}
# {"SP", "RJ", "MG"}

Aplicações práticas com Pandas

import pandas as pd

# Renomear múltiplas colunas de uma vez:
df.columns = [col.lower().replace(" ", "_") for col in df.columns]

# Criar lista de nomes de arquivos para um intervalo de datas:
arquivos = [f"vendas_{ano}_{mes:02d}.csv"
            for ano in [2025, 2026]
            for mes in range(1, 13)]

Perguntas frequentes

List comprehension é sempre mais rápida que loop for?

Geralmente sim — entre 20-50% mais rápida para operações simples. Mas para lógica muito complexa, um loop for com comentários pode ser mais legível e manutenível. Priorize legibilidade em código de produção.

Qual a diferença entre list comprehension e generator expression?

Generator expression usa parênteses em vez de colchetes: (x**2 for x in range(1000)). Não cria a lista em memória — gera os valores sob demanda. Use quando você só vai iterar o resultado uma vez ou quando a lista seria muito grande.