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ó.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Compreensão com condição.
Os objetivos desta aula. 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ó.
Veja o essencial, parte por parte.
O if no fim, que filtra. if no fim (depois do for) filtra: só entram os itens que passam no teste.
O if/else no início, que escolhe o valor. Escrever [n if n % 2 == 0 for n in numeros] dá erro de sintaxe.
Juntando as duas ideias com cuidado. As duas construções podem conviver na mesma linha, mas aí o cuidado com a legibilidade cresce.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
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.