List comprehension em Python: sintaxe, exemplos e quando evitar
Aprenda a list comprehension do Python passo a passo: crie, filtre e transforme listas em uma linha, veja tempos medidos em comparação com laços e saiba quando um laço for é mais legível.
- O padrão é
[expressão for item in iterável if condição]. - Um
ifsimples no final filtra; umif-elseno início escolhe entre dois valores. - No nosso teste, a compreensão foi cerca de 37% mais rápida que um laço com
append. - Use uma expressão geradora para dados enormes e um laço comum quando a lógica precisar de vários passos claros.
Uma list comprehension em Python cria uma lista nova a partir de qualquer iterável em uma única linha legível. Em vez de criar uma lista vazia, percorrê-la e chamar append, você descreve o resultado que quer.
Este guia vai do padrão básico aos filtros, aos laços aninhados e aos tempos que medimos nós mesmos. Se Python é novidade para você, comece pelo tutorial de Python para iniciantes (em inglês) e mantenha o ambiente organizado com o guia de ambientes virtuais (em inglês).
Sintaxe da list comprehension em Python
Leia da esquerda para a direita: a expressão diz como é cada item novo e a parte for diz de onde vêm os itens.
squares = [x * x for x in range(6)]
print(squares) # [0, 1, 4, 9, 16, 25]
names = [" Hi ", " QA "]
clean = [n.strip().lower() for n in names]
print(clean) # ['hi', 'qa']
O mesmo resultado com um laço exige mais três linhas. Essa economia é o objetivo, desde que a linha continue fácil de ler.
Filtrar itens com uma condição
Adicione um if depois do laço para manter apenas os itens que passam na condição.
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
List comprehension em Python com if-else
Quando você quer um valor para cada item, coloque o if-else antes do for. É onde a maioria dos iniciantes erra, porque um else no final é um erro de sintaxe.
labels = ["even" if x % 2 == 0 else "odd" for x in range(4)]
print(labels) # ['even', 'odd', 'even', 'odd']
Regra prática: um if no final remove itens; um if-else no início altera itens. Com if-else, o tamanho da lista não muda.
Laços aninhados e achatamento
Várias cláusulas for são lidas na mesma ordem dos laços aninhados. Use-as para achatar uma lista de listas ou formar pares.
matrix = [[1, 2, 3], [4, 5, 6]]
flat = [n for row in matrix for n in row]
print(flat) # [1, 2, 3, 4, 5, 6]
pairs = [(x, y) for x in range(1, 3) for y in "ab"]
print(pairs) # [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
Para transpor a matriz, aninhe uma compreensão dentro de outra: [[r[i] for r in matrix] for i in range(3)] resulta em [[1, 4], [2, 5], [3, 6]]. Dois níveis são o limite prático antes de a legibilidade cair.
Formas de dicionário, conjunto e gerador
Troque os delimitadores e a mesma ideia cria outros tipos.
lengths = {w: len(w) for w in ["pip", "venv", "uv"]} # {'pip': 3, 'venv': 4, 'uv': 2}
unique = {len(w) for w in ["pip", "venv", "uv", "git"]} # {2, 3, 4}
total = sum(x * x for x in range(1_000_000)) # generator, no list
Compare os próprios tipos no nosso guia sobre listas, tuplas, conjuntos e dicionários (em inglês).
Velocidade e memória: o que medimos
Cronometramos cada versão no Python 3.13.6 com 100.000 inteiros, usando o melhor de cinco execuções. Seus números serão diferentes, mas a ordem é estável.
| Tarefa | Tempo |
|---|---|
Laço com append (dobrar cada item) | 5,18 ms |
| List comprehension (dobrar cada item) | 3,25 ms |
list(map(lambda ...)) | 6,50 ms |
| Filtrar pares com um laço | 3,62 ms |
| Filtrar pares com uma compreensão | 3,43 ms |
A compreensão supera com clareza o laço com append, mas a diferença diminui quando quase todo o tempo vai para a condição. Na memória, uma lista de um milhão de inteiros dobrados ocupou cerca de 8,4 MB, enquanto o gerador equivalente tinha 200 bytes, porque produz os valores um de cada vez.
Quando não usar uma list comprehension
- Você só precisa de efeitos colaterais, como imprimir ou salvar. Use um laço comum; uma compreensão criaria uma lista inútil.
- A lógica tem vários passos. Se precisar de uma segunda variável ou de um
try, escreva um laço ou uma função pequena. - Os dados são enormes. Use uma expressão geradora para que o Python não guarde a lista inteira na memória.
- Ela precisa de mais de duas cláusulas
for. Divida em passos nomeados para o próximo leitor.
Considerações finais
Use uma list comprehension em Python quando uma linha curta disser exatamente o que você quer, e um laço quando não disser. Comece pelo padrão básico, adicione um filtro e pratique a forma if-else até a ordem ficar natural.
Perguntas frequentes
O que é uma list comprehension em Python?
É uma forma compacta de criar uma lista aplicando uma expressão a cada item de um iterável, com uma condição opcional para filtrar.
Como usar if-else em uma list comprehension?
Coloque a expressão condicional antes da cláusula for, por exemplo ["even" if x % 2 == 0 else "odd" for x in nums]. Um filtro simples usa apenas um if depois do laço.
Uma list comprehension é mais rápida que um laço for?
Em geral, sim. No nosso teste com 100.000 itens, foi cerca de 37% mais rápida que um laço com append, mas a legibilidade deve decidir primeiro.
Qual é a diferença entre list comprehension e expressão geradora?
A list comprehension cria a lista inteira na memória de uma vez. A expressão geradora usa parênteses e produz um valor por vez, o que economiza memória com dados grandes.
Posso aninhar list comprehensions?
Sim, para achatar ou transpor uma matriz. Fique em dois níveis e passe para um laço se ficar difícil de ler.
Continue aprendendo (artigos em inglês)
Precisa de ajuda com testes, WordPress ou SEO?
Ajudamos equipes a entregar software melhor e a fazer seus sites crescerem. Conte no que você está trabalhando e sugeriremos um próximo passo claro.
Mais guias sobre testes, IA e desenvolvimento moderno
Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.
Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las
Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…
Leia o artigo →DevOpsVariáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos
Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…
Leia o artigo →Desenvolvimento de softwareExplicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429
Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…
Leia o artigo →Automação de testesZombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem
Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…
Leia o artigo →Teste de softwareCobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa
Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…
Leia o artigo →Bancos de dados e SQLDELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um
DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…
Leia o artigo →Bancos de dados e SQLExibições SQL explicadas: crie, use e evite as armadilhas, com exemplos
Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…
Leia o artigo →Desenvolvimento de softwareInterface TypeScript vs tipo: diferenças reais, testadas com o compilador
Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…
Leia o artigo →Desenvolvimento de softwarePython *args e **kwargs explicados: funções flexíveis com exemplos claros
Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…
Leia o artigo →Desenvolvimento de softwareFunções Python Lambda: sintaxe, usos reais e quando não usá-los
Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …
Leia o artigo →Inteligência artificialO que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar
O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …
Leia o artigo →DevOpsMonitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos
Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…
Leia o artigo →DevOpsDocker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa
Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…
Leia o artigo →Automação de testesTDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um
TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…
Leia o artigo →Desenvolvimento de softwareGit merge vs rebase: diferenças, exemplos e quando usar cada um
Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.
Leia o artigo →Desenvolvimento de softwareList comprehension em Python: sintaxe, exemplos e quando evitar
List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.
Leia o artigo →Bancos de dados e SQLSQL JOIN explicado com exemplos (Inner, Left, Right, Full)
Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…
Leia o artigo →