Algoritmos

List comprehension em Python: o que é e como usar

Capa do artigo List comprehension em Python: o que é e como usar
Leitura com foco

Entenda o contexto.
Leve para a prática.

Neste artigo
  1. Como transformar cada valor de uma lista?
  2. Como filtrar valores?
  3. Como ler uma list comprehension completa?
  4. Aí você pergunta: e o if com else?
  5. Como fica em PHP e em C?
  6. Onde isso aparece na estatística?
  7. Quando não usar list comprehension?
  8. Quais são os erros mais comuns com list comprehension?
  9. 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]
Diagrama de uma lista de cinco notas em que só as três notas maiores ou iguais a 6 passam para a lista nova
O filtro em ação: só as notas que passam no teste entram na lista nova.

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.

Diagrama das três partes de uma list comprehension, expressão, for e if, ligadas às linhas do laço equivalente com append
As três partes da list comprehension e as linhas correspondentes no laço com append.

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 ficaO que fazTamanho da lista nova
if no fim, depois do forFiltra: só entra quem passa no testeIgual ou menor
if e else antes do forTransforma: todos entram, e o valor depende do testeSempre igual
Os dois papéis do if em uma list comprehension.

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 um else.
  • Esquecer que a expressão vem primeiro. Em [nota for nota in notas], o primeiro nota é 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.
Sobre quem escreve

Walmir Silva

Olá! Sou Walmir, engenheiro de software com MBA em Engenharia de Software e o cérebro por trás do GrowthCode e autor do livro "Além do Código".

Se você acha que programação é apenas sobre escrever código, prepare-se para expandir seus horizontes. Aqui, nós vamos além do código e exploramos as interseções fascinantes entre tecnologia, negócios, artes e filosofia.

Você está em busca de crescimento na carreira? Quer se destacar em um mercado competitivo? Almeja uma vida mais rica em conhecimento e realização? Então você chegou ao lugar certo. No GrowthCode, oferecemos insights profundos, estratégias comprovadas e um toque de sabedoria filosófica para catalisar seu crescimento pessoal e profissional.

Ver todos os artigos →

Continue a conversa

Compartilhe sua perspectiva

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Encontre sua próxima resposta

O que você quer aprender?

Preferências de cookies

Os cookies opcionais começam desligados. Você pode mudar a escolha a qualquer momento por esta tela.

NecessáriosSempre ativos

Guardam a sua escolha de cookies e mantêm o site funcionando. Não são usados para publicidade.

Contam visitas e mostram como o site é usado: Google Analytics e Microsoft Clarity, carregados pelo Google Tag Manager. Como esse contêiner também carrega tags de publicidade, as estatísticas só são ativadas junto com Publicidade e marketing.

Exibem anúncios do Google AdSense e medem campanhas e e-mails: pixels da Meta e do TikTok e o Mautic.

Permite que o Google escolha anúncios com base nos seus interesses. Desligado, os anúncios aparecem sem personalização. Depende de Publicidade e marketing.

Também é possível bloquear cookies nas configurações do navegador. Detalhes na Política de privacidade.