Neste artigo
- Como transformar cada valor de uma lista?
- Como filtrar valores?
- Como ler uma list comprehension completa?
- Aí você pergunta: e o if com else?
- Como fica em PHP e em C?
- Onde isso aparece na estatística?
- Quando não usar list comprehension?
- Quais são os erros mais comuns com list comprehension?
- Agora é com você!
List comprehension é uma forma de criar uma lista em uma única linha, escrevendo dentro dos colchetes uma expressão, um for e, se for o caso, um if. Ela faz o mesmo trabalho de um laço que enche uma lista vazia com append, só que de forma mais curta.
No artigo sobre vetores e matrizes você percorreu listas com o for. No artigo sobre tuplas e desempacotamento, viu que o Python gosta de resolver em uma linha o que outras linguagens resolvem em três. A list comprehension é mais um caso desses. O nome fica em inglês mesmo, porque é assim que você vai encontrar na documentação e no código dos outros. Ela entrou na linguagem na versão 2.0, a partir de uma proposta de 2000, e aparece em vários programas dos próximos artigos. Vale aprender a ler sem tropeçar.
Pense em um pedido na feira: “de cada fruta dessa caixa, quero as maduras, já lavadas”. Tem três partes aí. De onde vêm os itens: da caixa. Quem entra: só as maduras. E o que fazer com cada uma: lavar. A list comprehension tem exatamente essas três partes, escritas dentro de colchetes.
Como transformar cada valor de uma lista?
Comece pelo caso mais simples: aplicar a mesma conta em todos os valores. Uma loja quer dar 10% de desconto em três preços. Veja os dois jeitos, um depois do outro:
precos = [12.5, 25.0, 37.5]
# Jeito longo: lista vazia, laço e append
com_desconto = []
for preco in precos:
com_desconto.append(preco * 0.9)
print(com_desconto)
# Jeito curto: list comprehension
com_desconto = [preco * 0.9 for preco in precos]
print(com_desconto)
Saída:
[11.25, 22.5, 33.75] [11.25, 22.5, 33.75]
As duas listas saíram iguais. No jeito curto, leia assim: “preco * 0.9, para cada preco em precos”. O tutorial oficial do Python apresenta a list comprehension com essa mesma comparação: um laço com append de um lado, a versão em uma linha do outro, e a observação de que a segunda é mais concisa e legível.
Como filtrar valores?
Agora a segunda peça: o if no fim, que decide quem entra. De cinco notas, quero só as que são 6 ou mais:
notas = [7.5, 4.0, 9.5, 5.5, 8.5] aprovadas = [nota for nota in notas if nota >= 6] print(aprovadas)
Saída:
[7.5, 9.5, 8.5]

Repare que aqui a expressão é só nota: o valor entra na lista nova do jeito que está. Quem não passa no teste simplesmente fica de fora.
Como ler uma list comprehension completa?
Com as duas peças juntas, dá para transformar e filtrar ao mesmo tempo. Quero o quadrado dos números pares de 1 a 10:
quadrados_dos_pares = [numero * numero for numero in range(1, 11) if numero % 2 == 0] print(quadrados_dos_pares)
Saída:
[4, 16, 36, 64, 100]
A dica para ler sem se perder: comece pelo for. Primeiro veja de onde vêm os valores, depois quem passa no teste e, por último, o que é guardado.

Segundo o tutorial do Python, a estrutura é sempre esta: colchetes, uma expressão, um for e, depois dele, quantos for ou if forem necessários. O resultado é uma lista nova.
Aí você pergunta: e o if com else?
Aqui mora a confusão mais comum. O if pode aparecer em dois lugares, com dois papéis diferentes:
saldos = [50, -20, 0, 30, -5] # if no fim: filtra (fica só quem passa no teste) positivos = [saldo for saldo in saldos if saldo > 0] print(positivos) # if e else antes do for: transforma (todos ficam, com o valor trocado) sem_negativos = [saldo if saldo > 0 else 0 for saldo in saldos] print(sem_negativos)
Saída:
[50, 30] [50, 0, 0, 30, 0]
| Onde fica | O que faz | Tamanho da lista nova |
|---|---|---|
if no fim, depois do for | Filtra: só entra quem passa no teste | Igual ou menor |
if e else antes do for | Transforma: todos entram, e o valor depende do teste | Sempre igual |
ATENÇÃO: antes do for, o else é obrigatório. Escrever [saldo if saldo > 0 for saldo in saldos] faz o Python parar com SyntaxError: expected 'else' after 'if' expression.
Como fica em PHP e em C?
O PHP não tem list comprehension, mas tem duas funções que fazem as mesmas duas tarefas: array_filter para filtrar e array_map para transformar. Veja em PHP:
<?php
$notas = [7.5, 4.0, 9.5, 5.5, 8.5];
// Filtrar: fica só quem passa no teste
$aprovadas = array_values(array_filter($notas, fn($nota) => $nota >= 6));
echo implode(", ", $aprovadas), "\n";
// Transformar: aplica a conta em cada valor
$precos = [12.5, 25.0, 37.5];
$comDesconto = array_map(fn($preco) => $preco * 0.9, $precos);
echo implode(", ", $comDesconto), "\n";
Saída:
7.5, 9.5, 8.5 11.25, 22.5, 33.75
O manual do PHP descreve o array_map como a função que aplica outra função em cada elemento do array. Já o array_filter mantém as chaves originais dos itens que sobraram (aqui, 0, 2 e 4), e por isso o array_values entra para renumerar a partir do zero.
Em C, não há atalho: é o laço completo, com um contador para saber quantos valores já entraram:
#include <stdio.h>
int main(void)
{
double notas[] = {7.5, 4.0, 9.5, 5.5, 8.5};
double aprovadas[5];
int quantidade = 0;
for (int i = 0; i < 5; i++) {
if (notas[i] >= 6) {
aprovadas[quantidade] = notas[i];
quantidade++;
}
}
for (int i = 0; i < quantidade; i++) {
printf("%.1f\n", aprovadas[i]);
}
return 0;
}
Saída:
7.5 9.5 8.5
Três linguagens, a mesma ideia: percorrer, testar e guardar. Foque no conceito, e não na linguagem!
Onde isso aparece na estatística?
Em quase toda conta que repete a mesma operação para cada valor. Um exemplo que você vai reencontrar: calcular quanto cada valor se afasta da média e elevar esse desvio ao quadrado.
dados = [4, 8, 6, 5, 7] media = sum(dados) / len(dados) desvios = [valor - media for valor in dados] print(desvios) quadrados = [desvio ** 2 for desvio in desvios] print(quadrados) print(sum(quadrados))
Saída:
[-2.0, 2.0, 0.0, -1.0, 1.0] [4.0, 4.0, 0.0, 1.0, 1.0] 10.0
Duas linhas resolveram o que pediria dois laços. Você também vai ver a mesma escrita sem colchetes, direto dentro de uma função: sum(valor ** 2 for valor in dados). Lê-se do mesmo jeito. A diferença é que não aparece uma lista nova no programa: os valores vão direto para a soma.
Quando não usar list comprehension?
Quando ela deixa de caber na cabeça. Uma linha com dois for e dois if funciona, mas quase ninguém lê de primeira. O próprio tutorial do Python, ao mostrar uma list comprehension dentro de outra, recomenda preferir as funções prontas da linguagem a construções complicadas.
A regra prática: se você precisa parar para decifrar, volte para o laço comum. Código bom é o que a próxima pessoa entende, e essa pessoa pode ser você daqui a seis meses.
Quais são os erros mais comuns com list comprehension?
- Pôr o if de filtro antes do for. O filtro vai no fim. Antes do
for, o Python espera umelse. - Esquecer que a expressão vem primeiro. Em
[nota for nota in notas], o primeironotaé o que será guardado, e o segundo é a variável do laço. - Usar para executar tarefas em vez de montar uma lista. Se o objetivo é só mostrar valores na tela, o laço comum é o caminho. List comprehension serve para criar lista.
- Empilhar condições demais em uma linha. Quando a linha passa do limite do que dá para ler, quebre em um laço.
Agora é com você!
Primeiro no papel. O que esta linha produz? [n * 2 for n in [3, 8, 5, 12] if n > 4]. Escreva a lista resultante e só depois confira no computador.
Depois, o caminho inverso. Reescreva a linha acima como um laço comum, com lista vazia e append. E, para fechar, monte uma list comprehension que receba uma lista de temperaturas em graus Celsius e devolva só as que estão acima de 30, já convertidas para Fahrenheit (multiplique por 1,8 e some 32). Tente sozinho, sem pedir a resposta pronta para ninguém, nem para a IA!
Até o próximo artigo!
Confiança Sempre!!!
Fontes:
- Python Software Foundation, tutorial oficial. Data Structures, com as seções sobre list comprehensions, a comparação com o laço e a recomendação sobre construções aninhadas.
- Python Software Foundation, proposta de melhoria da linguagem. PEP 202: List Comprehensions, com a proposta original, criada em julho de 2000 para o Python 2.0.
- PHP, manual oficial. array_map, com a aplicação de uma função em cada elemento de um array e a referência à função array_filter.
- Python Software Foundation, referência da linguagem. Displays for lists, sets and dictionaries, com a regra formal da sintaxe.
- PHP, manual oficial. array_filter, com o aviso de que as chaves são preservadas e a renumeração com array_values.
- Loyola University Chicago, livro do curso de introdução à computação. List Comprehensions, com a construção de listas a partir de sequências.
- CoderPad. Python List Comprehension: The Comprehensive Guide, com o filtro, o if com else e a origem na PEP 202.
- Flavio Copes. Python List comprehensions, com transformações, filtros e os casos em que um laço fica mais claro.
- Os exemplos deste artigo foram executados em Python 3.13, PHP 8.3 e GCC 13.

Continue a conversa