Módulo 2 - Compreensões de lista, dicionário e conjunto
Compreensão de conjunto e a espiada em generator
10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Escrever uma compreensão de conjunto e entender que ela remove duplicatas.
- Distinguir quando o resultado com chaves é conjunto e quando é dicionário.
- Reconhecer a generator expression pela troca de colchetes por parênteses.
- Entender, em visão geral, o que significa uma avaliação preguiçosa.
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 de conjunto e a espiada em generator.
Os objetivos desta aula. Escrever uma compreensão de conjunto e entender que ela remove duplicatas. Distinguir quando o resultado com chaves é conjunto e quando é dicionário. Reconhecer a generator expression pela troca de colchetes por parênteses. Entender, em visão geral, o que significa uma avaliação preguiçosa.
Veja o essencial, parte por parte.
Conjunto: repetição não passa. A compreensão de conjunto usa chaves { } e uma expressão, sem par chave: valor.
A prima preguiçosa: generator expression. Precisa da lista inteira, para indexar, ordenar ou reusar: compreensão de lista.
A família de compreensões, junta. Agora você conhece as quatro formas e dá para vê-las lado a lado.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Conjunto: repetição não passa
A compreensão de conjunto usa chaves, como a de dicionário, mas com uma única expressão, sem o par com dois-pontos. O que a torna especial é uma característica do próprio conjunto: ele não guarda valores repetidos. Então, se a expressão gerar o mesmo valor mais de uma vez, ele aparece uma vez só no resultado. Isso faz da compreensão de conjunto um jeito enxuto de extrair os valores distintos de uma sequência.
palavras = ["sol", "lua", "sol", "mar", "lua", "sol"]
unicas = {p for p in palavras}
print(unicas) # {'sol', 'lua', 'mar'} (ordem pode variar)
print(len(unicas)) # 3O conjunto descarta repetições sozinho: das seis palavras, sobram três distintas.
Uma dúvida honesta é como o Python sabe, com chaves, se você quer um conjunto ou um dicionário. A resposta está nos dois-pontos. Se houver um par chave: valor, é dicionário; se houver só uma expressão, é conjunto. Há um único ponto de atenção: {} sozinho, sem nada dentro, é um dicionário vazio, não um conjunto vazio. Para um conjunto vazio, usa-se a função set(). Numa compreensão, porém, sempre há conteúdo, então a regra do dois-pontos resolve.
Compreensão de conjunto
- Chaves { } com uma expressão
- Sem dois-pontos
- Descarta valores repetidos
- {p for p in palavras}
Compreensão de dicionário
- Chaves { } com um par
- Com dois-pontos separando chave e valor
- Chaves únicas, valores livres
- {p: len(p) for p in palavras}
A prima preguiçosa: generator expression
Falta uma peça na família. Se você trocar os colchetes da compreensão de lista por parênteses, não obtém uma tupla, e sim uma generator expression. A diferença é profunda: a compreensão de lista constrói a lista inteira na memória de uma vez; o generator não constrói nada de imediato. Ele guarda a receita e vai produzindo os itens um a um, só quando alguém pede. A isso se dá o nome de avaliação preguiçosa, e é o que permite trabalhar com sequências gigantescas sem lotar a memória.
numeros = [1, 2, 3, 4, 5]
lista = [n * 2 for n in numeros] # constroi a lista inteira
gerador = (n * 2 for n in numeros) # so a receita, nada calculado ainda
print(lista) # [2, 4, 6, 8, 10]
print(gerador) # <generator object <genexpr> at 0x...>
print(sum(gerador)) # 30 (agora sim ele produz os itens, um a um)Parênteses criam um generator. Ele só produz os valores quando algo, como sum(), os consome.
Repare que imprimir o gerador não mostra os números; mostra um objeto gerador, porque ainda não calculou nada. Só quando uma função como sum() percorre o gerador é que os valores nascem, um de cada vez. Um detalhe importante: depois de consumido, o gerador se esgota e não pode ser percorrido de novo. Isso é normal, não um defeito, e faz todo sentido quando você entende a mecânica dos geradores. Esta aula é só a espiada; o módulo dedicado mostra por que isso é tão útil.
A família de compreensões, junta
Agora você conhece as quatro formas e dá para vê-las lado a lado. Colchetes constroem uma lista. Chaves com um par chave: valor constroem um dicionário. Chaves com uma só expressão constroem um conjunto sem repetições. Parênteses criam um generator preguiçoso. A gramática é a mesma nas quatro: uma expressão, um for e, se quiser, um if. O que muda é o delimitador e, no dicionário, a presença do par. Dominar isso deixa boa parte do seu código mais direto.
| Delimitador | Cria | Exemplo | Constrói na memória? |
|---|---|---|---|
| [ ] | lista | [n for n in xs] | Sim, tudo de uma vez |
| { } com par | dicionário | {n: n*n for n in xs} | Sim, tudo de uma vez |
| { } sem par | conjunto | {n for n in xs} | Sim, sem repetições |
| ( ) | generator | (n for n in xs) | Não, item a item |
As quatro formas: só muda o delimitador (e o par, no dicionário).
Guarde o generator com carinho, porque ele volta com força mais adiante no curso, no módulo de geradores. Por ora, o essencial é reconhecê-lo pela troca dos colchetes por parênteses e entender que ele é preguiçoso: não faz o trabalho até ser cobrado. Com as compreensões de lista, dicionário e conjunto firmes, você já tem o suficiente para a prática da próxima aula, onde tudo isso se junta em um problema real de transformação de dados.
Teste rápido
O que (n * 2 for n in [1, 2, 3]) cria?
Perguntas frequentes
- Por que { } vazio é dicionário e não conjunto?
- Por herança histórica: as chaves foram usadas para dicionários bem antes de os conjuntos ganharem essa sintaxe. Então {} sozinho ficou sendo dicionário vazio. Para um conjunto vazio, use set(). Em compreensões isso não incomoda, porque sempre há uma expressão dentro que revela a intenção.
- A compreensão de conjunto mantém a ordem dos itens?
- Não. Conjuntos não têm ordem garantida, então a sequência em que os itens aparecem ao imprimir pode variar. Se a ordem importa, use uma lista. O conjunto serve quando o que interessa é a pertinência e a ausência de repetições, não a posição.
- Qual a real vantagem do generator sobre a lista?
- Memória. A lista guarda todos os itens ao mesmo tempo; o generator produz um de cada vez e descarta. Para milhões de itens que você só vai somar ou percorrer uma vez, o generator evita alocar tudo. Para dados pequenos ou que serão reusados, a lista é mais prática.
- Posso indexar um generator, tipo gerador[0]?
- Não. Generator não suporta índice nem len(), justamente porque não construiu os itens. Você só pode percorrê-lo, uma vez, do começo ao fim. Se precisar indexar ou reusar, transforme em lista com list(gerador), abrindo mão da economia de memória.
- Por que meu generator ficou vazio na segunda vez?
- Porque ele se esgota após ser consumido. Ao percorrê-lo uma vez, os itens são produzidos e passam; uma segunda passada não encontra mais nada. Isso é o comportamento esperado. Para percorrer de novo, recrie o generator ou use uma lista, que pode ser lida quantas vezes quiser.
- Preciso dominar geradores agora?
- Não. Esta aula é só uma espiada para você reconhecer a sintaxe com parênteses e a ideia de preguiça. O módulo de geradores, mais adiante, explica yield, funções geradoras e por que tudo isso é poderoso. Por ora, saber diferenciar os quatro delimitadores já basta.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.