List comprehension em Python: sintaxe, exemplos e quando evitar

  1. Início
  2. Blog
  3. Desenvolvimento de software
Desenvolvimento de software

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.

7 min de leitura
List comprehension em Python: sintaxe, exemplos e quando evitar
Pontos principais
  • O padrão é [expressão for item in iterável if condição].
  • Um if simples no final filtra; um if-else no 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.

TarefaTempo
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ço3,62 ms
Filtrar pares com uma compreensão3,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)

Trabalhe com a Stack Quora

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.

Continue lendo

Mais guias sobre testes, IA e desenvolvimento moderno

Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.

Inteligência artificial

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 →
DevOps

Variá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 software

Explicaçã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 testes

Zombando 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 software

Cobertura 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 SQL

DELETE 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 SQL

Exibiçõ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 software

Interface 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 software

Python *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 software

Funçõ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 artificial

O 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 →
DevOps

Monitoramento 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 →
DevOps

Docker 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 testes

TDD 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 software

Git 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 software

List 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 SQL

SQL 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 →