
Passo 1 de 7
Do laço à compreensão de lista
Converta um laço com for e append em uma compreensão e preveja a lista produzida.
Trilha de aprendizado · Nível 3 · Tutorial 10
Construir listas, dicionários e conjuntos com compreensões legíveis, escolhendo laços explícitos quando a transformação exigir lógica mais extensa.
Do laço à compreensão de lista
Converta um laço com for e append em uma compreensão e preveja a lista produzida. 3 min
Filtrar antes de transformar
Combine transformação e filtro em uma compreensão de lista e acompanhe a ordem em que cada parte é avaliada. 4 min
Construir dicionários e lidar com chaves repetidas
Calcule chaves e valores em uma compreensão e identifique qual valor permanece quando uma chave se repete. 3 min
Produzir resultados únicos com conjuntos
Combine transformação e filtro para obter categorias únicas e confira o resultado sem depender da ordem. 3 min
Novo contêiner não significa cópia profunda
Preveja quando uma alteração feita no resultado de uma compreensão também afeta os registros de origem. 3 min
Escolher pela clareza, não pelo tamanho
Escolha entre compreensão e laço explícito considerando a intenção, a legibilidade e as ações necessárias. 3 min
Aplicação final: transformar um pequeno catálogo
Transforme um catálogo com três compreensões e confira filtros, repetições e chaves repetidas. 5 min

Passo 1 de 7
Converta um laço com for e append em uma compreensão e preveja a lista produzida.
Você já construiu listas com for e append. Uma compreensão de lista é uma expressão que constrói uma nova lista a partir dos dados de origem.
A estrutura é [expressão_de_saída for elemento in origem]. O valor que iria para o append passa a aparecer no início, dentro dos colchetes.
numeros = [3, 1, 3]
# Com laço e append
dobros = []
for numero in numeros:
dobros.append(numero * 2)
# Com compreensão de lista
dobros = [numero * 2 for numero in numeros]
print(dobros) # [6, 2, 6]![Comparação entre dobros.append(numero * 2) dentro de um for e a compreensão [numero * 2 for numero in numeros]. Uma seta liga numero * 2 nas duas formas, e outra liga as cláusulas for.](https://cursa-json-routes.s3.amazonaws.com/learning-paths/pt/python/b730454e0225/level-03/tutorial-10/step-01/screen-01/item-03.webp)
A expressão de saída aparece primeiro na escrita, mas é calculada para cada elemento percorrido pelo for.
numeros = [2, 0, 2]
resultado = []
for numero in numeros:
resultado.append(numero + 5)Complete somente a expressão que falta para produzir a mesma lista:
resultado = [___ for numero in numeros]
A expressão de saída também pode usar métodos de texto conhecidos. Leia o exemplo assim: “para cada nome em nomes, produza nome.strip().lower()”.
A lista mantém a ordem do percurso e os resultados repetidos. Transformar dois textos no mesmo resultado não elimina nenhum deles.
strip remove os espaços das extremidades; lower transforma o texto em minúsculas.
nomes = [" Ana ", "BIA", "ana"]
normalizados = [nome.strip().lower() for nome in nomes]
print(normalizados)
# ['ana', 'bia', 'ana']Antes de executar, acompanhe a transformação de cada elemento.
palavras = [" SOL ", "lua", "Sol"]
resultado = [palavra.strip().lower() for palavra in palavras]
print(resultado)Qual lista será exibida?

Passo 2 de 7
Combine transformação e filtro em uma compreensão de lista e acompanhe a ordem em que cada parte é avaliada.
Para transformar apenas alguns elementos, acrescente if condição depois da cláusula for.
A fonte é avaliada primeiro. Depois, para cada elemento, Python testa o filtro: só quando a condição é verdadeira ele calcula a expressão de saída e acrescenta o resultado à lista. Embora a expressão de saída apareça à esquerda, ela é calculada depois do teste.
numeros = [-2, 0, 3, 3]
dobros = [numero * 2 for numero in numeros if numero > 0]
print(dobros)
# [6, 6]![A fonte contém -2, 0, 3 e 3. O filtro numero > 0 exclui -2 e 0. Cada ocorrência de 3 passa pelo filtro, é multiplicada por 2 e produz um 6. A lista final é [6, 6].](https://cursa-json-routes.s3.amazonaws.com/learning-paths/pt/python/b730454e0225/level-03/tutorial-10/step-02/screen-01/item-03.webp)
Fonte → filtro de cada elemento → transformação dos aprovados → lista.
Ordene o fluxo da compreensão anterior, do início até a inclusão de um elemento aprovado.
Um elemento reprovado não gera um valor substituto: nem 0, nem None. Ele simplesmente não contribui para a lista.
Isso também significa que a expressão de saída não é calculada para ele. No exemplo abaixo, o filtro impede que a divisão seja feita quando numero vale zero.
numeros = [0, 2, 5]
resultados = [10 / numero for numero in numeros if numero != 0]
print(resultados)
# [5.0, 2.0]
maiores = [10 / numero for numero in numeros if numero > 10]
print(maiores)
# []Dica
A compreensão ainda cria uma lista, mas ela fica vazia: []. No segundo caso, nenhum elemento é maior que 10, então nenhuma divisão é calculada.
Leia sem executar primeiro.
numeros = [-3, 0, 2, 2, 7]
triplos = [numero * 3 for numero in numeros if numero >= 2]
print(triplos)Qual lista será impressa? Explique por que -3 e 0 não geram valores. Depois, preveja o resultado se apenas o filtro mudar para numero > 10.
Escreva pelo menos 30 caracteres (0/30).

Passo 3 de 7
Calcule chaves e valores em uma compreensão e identifique qual valor permanece quando uma chave se repete.
Para construir um dicionário, use chaves externas e separe as expressões de chave e valor com dois-pontos:
{expressão_chave: expressão_valor for elemento in origem if condição}
No exemplo abaixo, cada par fornece nome e quantidade. Se a quantidade for positiva, calculamos a chave com o nome normalizado e o valor com o dobro da quantidade. O filtro é opcional.
Cada par aprovado gera uma associação entre uma chave e um valor.
materiais = [(" Papel ", 4), (" Cola ", 0), (" TINTA ", 3)]
quantidades_dobradas = {
nome.strip().lower(): quantidade * 2
for nome, quantidade in materiais
if quantidade > 0
}
print(quantidades_dobradas)
# {'papel': 8, 'tinta': 6}Complete a compreensão para que nomes como " Papel " gerem a chave "papel":
{___: quantidade * 2 for nome, quantidade in materiais if quantidade > 0}
Agora complete o valor para guardar o dobro de cada quantidade aprovada:
{nome.strip().lower(): ___ for nome, quantidade in materiais if quantidade > 0}
" Caneta " e "caneta" viram a mesma chave após a normalização. Quando isso acontece, permanece o valor do último par produzido para essa chave, na ordem do percurso. Os valores não são somados.
Uma entrada rejeitada pelo filtro não produz um par e, portanto, não substitui nenhum valor.
materiais = [
(" Caneta ", 3),
("LÁPIS", 2),
("caneta", 5),
("CANETA", 0)
]
quantidades_dobradas = {
nome.strip().lower(): quantidade * 2
for nome, quantidade in materiais
if quantidade > 0
}
print(quantidades_dobradas)
# {'caneta': 10, 'lápis': 4}
O último elemento da origem é rejeitado. Para caneta, o último valor realmente produzido é 10.
Preveja o resultado antes de executar.
materiais = [("caneta", 5), (" Caneta ", 3), ("CANETA", 0)]
resultado = {
nome.strip().lower(): quantidade * 2
for nome, quantidade in materiais
if quantidade > 0
}
print(resultado)Qual dicionário será exibido?

Passo 4 de 7
Combine transformação e filtro para obter categorias únicas e confira o resultado sem depender da ordem.
A compreensão de conjunto usa a estrutura {expressão for elemento in origem if condição}. Diferentemente do dicionário, há apenas uma expressão de saída, sem o par chave:valor.
No exemplo, a lista e o conjunto usam a mesma transformação e o mesmo filtro. A diferença está nos delimitadores: [] ou {}.
categorias = [" Livro ", "livro", " PAPEL ", " "]
lista = [texto.strip().lower() for texto in categorias if texto.strip()]
unicas = {texto.strip().lower() for texto in categorias if texto.strip()}
print(lista) # ['livro', 'livro', 'papel']
print(unicas) # Uma exibição possível: {'livro', 'papel'}
Entradas diferentes podem produzir o mesmo texto normalizado. A lista mantém a repetição; o conjunto reúne apenas os resultados únicos.
Dica
O filtro if texto.strip() exclui textos que ficam vazios após a remoção dos espaços. Para conferir o conjunto, use unicas == {'livro', 'papel'}: o resultado é True, independentemente da ordem de exibição.
Considere entradas = [' A ', 'a', ' ']. Associe cada compreensão ao resultado. Nos conjuntos, a ordem apresentada não importa.
Toque em um item e depois no par correspondente.
Use estes dados para responder. Se quiser executar sua solução, use o Python no seu computador.
categorias = [" Arte ", "arte", " CIÊNCIA ", " ", "ciência", "Música"]Escreva uma compreensão que atribua a unicas as categorias sem espaços nas extremidades e em letras minúsculas, excluindo textos que ficam vazios após strip().
Em seguida, indique quais elementos estarão no conjunto. Não é necessário colocá-los em uma ordem específica.
Escreva pelo menos 20 caracteres (0/20).

Passo 5 de 7
Preveja quando uma alteração feita no resultado de uma compreensão também afeta os registros de origem.
Como você já viu ao estudar referências, um contêiner novo pode compartilhar objetos internos. Na compreensão abaixo, a expressão de saída é registro: ela devolve o próprio dicionário, sem copiá-lo.
origem = [
{"nome": "Caneta", "quantidade": 3},
{"nome": "Caderno", "quantidade": 0}
]
disponiveis = [registro for registro in origem
if registro["quantidade"] > 0]
print(disponiveis is origem) # False
print(disponiveis[0] is origem[0]) # True
O filtro seleciona o registro; não cria uma cópia profunda dele.
origem = [{"nome": "Caneta", "quantidade": 3}]
disponiveis = [registro for registro in origem
if registro["quantidade"] > 0]
disponiveis[0]["quantidade"] = 8Depois desse código, origem[0]["quantidade"] continua sendo 3, porque a compreensão criou uma lista nova.
Selecionar registro mantém o dicionário compartilhado. Extrair registro["nome"] ou registro["quantidade"] produz uma lista de textos ou números, sem um vínculo que atualize os campos de origem.
Além disso, substituir uma posição da lista resultante muda apenas essa lista: não modifica o objeto que ocupava a posição.
origem = [{"nome": "Caneta", "quantidade": 3}]
selecionados = [registro for registro in origem]
nomes = [registro["nome"] for registro in origem]
# Substitui a referência em uma posição da nova lista.
selecionados[0] = {"nome": "Caderno", "quantidade": 5}
# Substitui um texto na outra lista.
nomes[0] = "Lápis"
print(origem)
# [{'nome': 'Caneta', 'quantidade': 3}]Dica
Qual objeto está sendo alterado: a nova lista ou um dicionário compartilhado dentro dela? Textos e números são imutáveis; substituí-los na lista não altera o registro de onde foram extraídos.
Leia as duas atribuições na ordem em que acontecem.
origem = [{"nome": "Caneta", "quantidade": 3}]
selecionados = [registro for registro in origem]
quantidades = [registro["quantidade"] for registro in origem]
selecionados[0]["quantidade"] = 8
selecionados[0] = {"nome": "Caderno", "quantidade": 0}
print(origem[0]["quantidade"])
print(quantidades)O que os dois prints exibem? Explique por que substituir selecionados[0] não desfaz a primeira alteração e por que quantidades mantém seu valor.
Escreva pelo menos 20 caracteres (0/20).

Passo 6 de 7
Escolha entre compreensão e laço explícito considerando a intenção, a legibilidade e as ações necessárias.
Uma compreensão funciona bem quando a intenção é construir uma coleção com uma transformação clara e um filtro simples. Compare as duas soluções equivalentes: os nomes ajudam a identificar a origem, o filtro e a saída.
precos = [10, 0, 20]
# Com laço
precos_com_desconto = []
for preco in precos:
if preco > 0:
precos_com_desconto.append(preco * 0.9)
# Com compreensão
precos_com_desconto = [preco * 0.9 for preco in precos if preco > 0]
print(precos_com_desconto) # [9.0, 18.0]
Se origem, filtro e saída ficam fáceis de localizar, a compreensão comunica bem a intenção.
Por que a compreensão do exemplo anterior é uma boa escolha?
Prefira o laço quando cada elemento exigir várias ações, alterações nos dados existentes ou lógica extensa. Aqui, a intenção não é produzir uma nova coleção: é atualizar cada pedido pendente e informar a mudança.
pedidos = [
{"numero": 1, "status": "pendente"},
{"numero": 2, "status": "enviado"}
]
for pedido in pedidos:
if pedido["status"] == "pendente":
pedido["status"] = "enviado"
print("Pedido enviado:", pedido["numero"])Atenção
Evite usar [print(pedido["numero"]) for pedido in pedidos] apenas para imprimir. Além das impressões, isso constrói uma lista de None, pois print retorna None. O mesmo problema aparece ao usar uma compreensão apenas para chamar update nos registros. Para essas ações, use um laço.
Escolha compreensão ou laço para cada tarefa e justifique:
A. Criar uma lista com os nomes em letras maiúsculas dos usuários ativos.
B. Percorrer os usuários ativos, mudar o campo ativo para False e imprimir uma confirmação para cada usuário alterado.
Considere o resultado desejado e a quantidade de ações por elemento.
Escreva pelo menos 40 caracteres (0/40).

Passo 7 de 7
Transforme um catálogo com três compreensões e confira filtros, repetições e chaves repetidas.
No Python do seu computador, crie um script com o código abaixo. Substitua as três coleções vazias por compreensões.
Use quantidade > 0 como filtro nas três:
Normalize nomes e categorias com strip().lower(). Antes de executar, preveja o que acontecerá com as duas entradas de lápis.
As coleções vazias são pontos de partida, não os resultados esperados. Mantenha os dados e os comandos print.
catalogo = [
{"nome": " Lápis ", "categoria": " Papelaria ", "quantidade": 5},
{"nome": "COLA", "categoria": "Adesivos", "quantidade": 0},
{"nome": "lápis", "categoria": "papelaria", "quantidade": 2},
{"nome": " Régua ", "categoria": " MEDIÇÃO ", "quantidade": 3},
]
# Substitua cada coleção vazia por uma compreensão.
nomes = []
estoque = {}
categorias = set()
print(nomes)
print(estoque)
print(categorias)
Lista: sequência de resultados. Dicionário: associação por chave. Conjunto: resultados únicos.
Execute seu script e registre:
Não é necessário enviar um arquivo. Na próxima tela, compare seu código com uma solução comentada.
Escreva pelo menos 80 caracteres (0/80).
As três compreensões selecionam os mesmos registros. O que muda é a expressão de saída e a estrutura construída. No seu script, substitua o trecho que começa em nomes pelo código abaixo, mantendo a definição de catalogo.
# Lista: mantém a ordem e os nomes repetidos.
nomes = [
material["nome"].strip().lower()
for material in catalogo
if material["quantidade"] > 0
]
# Dicionário: o último valor produzido para uma chave prevalece.
estoque = {
material["nome"].strip().lower(): material["quantidade"]
for material in catalogo
if material["quantidade"] > 0
}
# Conjunto: guarda apenas categorias normalizadas únicas.
categorias = {
material["categoria"].strip().lower()
for material in catalogo
if material["quantidade"] > 0
}
print(nomes)
print(estoque)
print(categorias)Exemplo
Lista:
['lápis', 'lápis', 'régua']
Dicionário:
{'lápis': 2, 'régua': 3}
Conjunto — uma ordem de exibição possível:
{'papelaria', 'medição'}
A cola tem quantidade zero e não contribui para nenhuma saída. As duas grafias de lápis viram a mesma chave: o valor 2 substitui o 5. As duas grafias de papelaria também se tornam iguais, deixando apenas um elemento no conjunto.
Resumo
Escolha a compreensão pela intenção, não apenas pela economia de linhas.
Parabéns! Você concluiu: Transformar e filtrar dados com compreensões
Você concluiu este nível!
Agora você vai iniciar: Funções e decomposição de problemas
Definir funções com parâmetros e retornoCrie funções que recebam dados, realizem uma operação específica e devolvam resultados para o restante do programa.Milhares de cursos online em vídeo, ebooks e áudiobooks.
Para testar seus conhecimentos no decorrer dos cursos online
Gerado diretamente na galeria de fotos do seu celular e enviado ao seu e-mail
Baixe nosso aplicativo pelo QR Code ou pelos links abaixo:.
+ de 10 milhões
de alunos
Certificado grátis e
válido em todo o Brasil
60 mil exercícios
gratuitos
4,8/5 classificação
nas lojas de apps
Cursos gratuitos em
vídeo, ebooks e audiobooks