Módulo 2 - Compreensões de lista, dicionário e conjunto

Compreensão com condição

11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Usar o if no fim da compreensão para filtrar quais itens entram.
  • Usar o if/else no início para decidir o valor de cada item.
  • Diferenciar as duas construções, que parecem iguais e não são.
  • Combinar filtro e transformação em uma compreensão só.

O if no fim, que filtra

A forma mais comum é o filtro. Você acrescenta um if no fim da compreensão, logo depois do for, e só os itens que satisfazem a condição entram na lista nova. Os outros são simplesmente ignorados, então a lista resultante costuma ser menor que a original. Leia a linha em voz alta: mantenha n, para cada n na sequência, se n for par. É quase a frase em português.

numeros = [1, 2, 3, 4, 5, 6, 7, 8]

pares = [n for n in numeros if n % 2 == 0]

print(pares)  # [2, 4, 6, 8]

O if no fim filtra: só os números pares passam para a lista nova.

Nada impede transformar e filtrar ao mesmo tempo. A expressão continua na frente, decidindo o que cada item vira, e o if no fim continua decidindo quais itens entram. No exemplo abaixo, pegamos só os números pares e, desses, guardamos o dobro. A ordem de leitura ajuda: primeiro o que sai (n * 2), depois de onde vem (for n in numeros) e por último o filtro (if n % 2 == 0).

numeros = [1, 2, 3, 4, 5, 6]

dobro_dos_pares = [n * 2 for n in numeros if n % 2 == 0]

print(dobro_dos_pares)  # [4, 8, 12]

Filtrar e transformar juntos: mantém os pares e guarda o dobro de cada um.

O if/else no início, que escolhe o valor

A segunda forma parece a mesma, mas faz outra coisa. Quando você quer que todos os itens entrem na lista, só que cada um com um valor diferente conforme uma condição, o if vai para o início, junto com um else, e não filtra nada. Isso é a expressão condicional do Python: valor_a if condição else valor_b. Como ela devolve um valor, ocupa o lugar da expressão, na frente do for. Nenhum item some; cada um vira uma coisa ou outra.

notas = [4, 8, 6, 3, 9, 5]

situacoes = ["aprovado" if nota >= 6 else "recuperacao" for nota in notas]

print(situacoes)
# ['recuperacao', 'aprovado', 'aprovado', 'recuperacao', 'aprovado', 'recuperacao']

O if/else no início escolhe o valor: a lista final tem o mesmo tamanho da original.

if no fim (filtro)

  • Fica depois do for
  • Não tem else
  • Descarta itens que não passam
  • A lista final pode ficar menor

if/else no início (escolha)

  • Fica antes do for, no lugar da expressão
  • Precisa de else
  • Mantém todos os itens
  • A lista final tem o mesmo tamanho

Juntando as duas ideias com cuidado

As duas construções podem conviver na mesma linha, mas aí o cuidado com a legibilidade cresce. É possível filtrar com um if no fim e, ao mesmo tempo, escolher o valor com um if/else no início. Funciona, e às vezes é exatamente o que você quer, mas a linha começa a ficar densa. Se você precisar parar para decifrar, é sinal de que talvez valha voltar ao for tradicional, que deixa cada passo explícito.

valores = [10, -3, 7, -8, 0, 4]

# Dos nao negativos, marca zero como "zero" e o resto como "positivo":
rotulos = ["zero" if v == 0 else "positivo" for v in valores if v >= 0]

print(rotulos)  # ['positivo', 'positivo', 'zero', 'positivo']

if/else no início (escolhe o rótulo) e if no fim (filtra os não negativos) na mesma linha.

Repare que os negativos foram descartados pelo filtro no fim, e os que sobraram receberam um rótulo pela expressão condicional no início. A linha faz duas coisas, e por isso pede atenção de quem lê. Uma boa prática é comentar o objetivo acima, como no exemplo, para que o próximo leitor não precise reconstruir a lógica de cabeça. Clareza continua sendo a meta, mesmo com recursos poderosos.

Teste rápido

Você quer manter só os itens positivos de uma lista. Onde vai o if?

Perguntas frequentes

Por que [n if n > 0 for n in lista] dá erro?
Porque um if sem else no início não é uma expressão válida; ele fica pela metade. Para filtrar, o if (sem else) tem que ir no fim, depois do for. Se você quer um if no início, ele precisa de else, formando a expressão condicional completa: valor_a if cond else valor_b.
Como sei se preciso de filtro ou de if/else?
Pergunte-se: a lista final deve ter menos itens que a original? Se sim, é filtro, if no fim. Todos os itens devem entrar, mas com valores diferentes conforme uma condição? Então é escolha, if/else no início. O tamanho da lista de saída é o melhor teste.
Posso ter mais de um if de filtro na mesma compreensão?
Pode. Vários if no fim funcionam como um E lógico: o item só entra se passar em todos. Por exemplo, [n for n in nums if n > 0 if n % 2 == 0] mantém os números que são positivos e pares ao mesmo tempo. Ainda assim, se a lógica crescer, o for normal pode ler melhor.
O else pode ter outra condição, tipo elif?
Não existe elif dentro da expressão condicional, mas você pode encadear: "a" if c1 else "b" if c2 else "c". Isso resolve casos com três saídas. Passou disso, a compreensão vira um quebra-cabeça e o for tradicional com if/elif/else é a escolha mais honesta.
O filtro roda antes ou depois da expressão?
O Python primeiro percorre a sequência, aplica o filtro do fim para decidir se o item entra e, só nos que passam, avalia a expressão do início. Na prática, pense assim: o filtro escolhe quem entra, a expressão decide o que cada um que entrou vira.
Isso vale também para dicionários e conjuntos?
Vale. As mesmas regras de if no fim (filtro) e if/else no início (escolha) funcionam nas compreensões de dicionário e de conjunto, que você vê nas próximas aulas. A posição do if tem sempre o mesmo significado, independentemente do tipo que está sendo construído.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.