Módulo 2 - Compreensões de lista, dicionário e conjunto
Prática: transformar dados de alunos
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Filtrar uma lista de dicionários com uma compreensão de lista e if.
- Mapear campos, extraindo só os nomes dos alunos.
- Montar um dicionário de nome para média com compreensão de dicionário.
- Combinar as três técnicas em uma solução clara de ponta a ponta.
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: Prática: transformar dados de alunos.
Os objetivos desta aula. Filtrar uma lista de dicionários com uma compreensão de lista e if. Mapear campos, extraindo só os nomes dos alunos. Montar um dicionário de nome para média com compreensão de dicionário. Combinar as três técnicas em uma solução clara de ponta a ponta.
Veja o essencial, parte por parte.
Os dados de partida. Filtrar aprovados: compreensão de lista com if no fim, testando a média.
Filtrar os aprovados e mapear os nomes. Com as médias prontas, filtrar os aprovados é uma compreensão de lista com if no fim.
Montar o dicionário de nome para média. Dados como lista de dicionários aparecem em JSON, CSV e respostas de API.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Os dados de partida
Vamos trabalhar com um formato que você vai encontrar sempre: uma lista de dicionários, em que cada dicionário é um aluno com nome e uma lista de notas. É assim que dados costumam chegar de um arquivo JSON ou de uma planilha convertida. O objetivo é responder três perguntas com compreensões: quem foi aprovado, quais são todos os nomes e qual a média de cada aluno. Comece copiando os dados abaixo no Playground.
alunos = [
{"nome": "Ana", "notas": [8, 9, 10]},
{"nome": "Bruno", "notas": [4, 5, 6]},
{"nome": "Carla", "notas": [7, 7, 8]},
{"nome": "Diego", "notas": [3, 4, 5]},
]
print(len(alunos), "alunos carregados") # 4 alunos carregadosA lista de dicionários de partida: cada aluno tem um nome e uma lista de notas.
Antes de filtrar, precisamos da média de cada aluno. A média é a soma das notas dividida pela quantidade, e você já conhece sum e len do Básico. Para não repetir essa conta o tempo todo, vamos primeiro montar uma versão dos dados com a média já calculada. Uma compreensão de lista, percorrendo os alunos, cria uma nova lista de dicionários, cada um com nome e média. Repare que estamos construindo dicionários novos dentro da compreensão.
com_media = [
{"nome": a["nome"], "media": sum(a["notas"]) / len(a["notas"])}
for a in alunos
]
for a in com_media:
print(a["nome"], a["media"])
# Ana 9.0
# Bruno 5.0
# Carla 7.333333333333333
# Diego 4.0Uma compreensão que monta dicionários novos, cada um com o nome e a média calculada.
Filtrar os aprovados e mapear os nomes
Com as médias prontas, filtrar os aprovados é uma compreensão de lista com if no fim. Digamos que a nota de corte seja seis. A compreensão percorre com_media e mantém só os dicionários cuja média chega a seis. O resultado é uma lista menor, com os mesmos dicionários, só que apenas os dos aprovados. É o filtro da aula 2 aplicado a dados de verdade, e a leitura continua direta: mantenha o aluno, para cada aluno, se a média dele for suficiente.
aprovados = [a for a in com_media if a["media"] >= 6]
for a in aprovados:
print(a["nome"], a["media"])
# Ana 9.0
# Carla 7.333333333333333Filtro com if no fim: só entram os alunos com média a partir de seis.
Mapear os nomes é ainda mais curto. Mapear significa transformar cada item em outro, aqui trocando o dicionário inteiro pelo valor de uma chave. A expressão vira a['nome'], que puxa o nome de cada dicionário. Dá para fazer isso com todos os alunos ou só com os aprovados, dependendo do que você precisa. Os dois exemplos abaixo mostram a diferença, e ambos são a mesma técnica de mapeamento vista na aula 1, agora extraindo um campo.
todos_os_nomes = [a["nome"] for a in alunos]
nomes_aprovados = [a["nome"] for a in aprovados]
print(todos_os_nomes) # ['Ana', 'Bruno', 'Carla', 'Diego']
print(nomes_aprovados) # ['Ana', 'Carla']Mapear extraindo um campo: a expressão a["nome"] troca o dicionário pelo nome.
Montar o dicionário de nome para média
A última tarefa junta o filtro com a compreensão de dicionário. Queremos um dicionário que ligue o nome de cada aprovado à sua média, para consultar rápido depois. A forma é {chave: valor for ...}: a chave é o nome, o valor é a média, e um if no fim mantém só os aprovados. Em uma expressão, saem o filtro, o mapeamento das chaves e dos valores, e o dicionário pronto para consulta por nome. É o encontro das aulas 2 e 4 em uma linha só.
nome_media = {
a["nome"]: round(a["media"], 1)
for a in com_media
if a["media"] >= 6
}
print(nome_media) # {'Ana': 9.0, 'Carla': 7.3}
print(nome_media["Ana"]) # 9.0Compreensão de dicionário com filtro: nome para média, só dos aprovados, arredondada.
Vale olhar o conjunto do que você fez. Partindo de uma lista de dicionários crua, você calculou médias, filtrou aprovados, mapeou nomes e montou um índice de nome para média, tudo com compreensões, sem um único laço com append. Compare mentalmente com quantas linhas isso levaria no estilo do Básico: criar listas vazias, abrir laços, indentar, dar append. As compreensões não deixaram só mais curto; deixaram cada passo com uma intenção legível. Esse é o ganho concreto do módulo.
Teste rápido
Qual compreensão cria um dicionário {nome: media} só dos alunos com media >= 7?
Perguntas frequentes
- Por que calcular a média em um passo separado?
- Para não repetir a mesma conta em cada compreensão seguinte e para deixar cada passo legível. Poderíamos fazer tudo em uma expressão só, mas ela ficaria densa. Quebrar em com_media, aprovados e nome_media é justamente o bom senso que o módulo prega: usar a compreensão sem sacrificar a clareza.
- Dá para filtrar e calcular a média na mesma compreensão?
- Dá, testando sum(a["notas"]) / len(a["notas"]) >= 6 direto no if. Funciona, mas repete a conta e alonga a linha. Calcular a média antes, em com_media, deixa o código mais claro e evita recalcular. Prefira legibilidade a espremer tudo em uma linha.
- Como acesso um campo dentro do dicionário na compreensão?
- Com colchetes e a chave, como a["nome"] ou a["notas"], onde a é a variável do laço que recebe cada dicionário. É a mesma forma de acessar dicionário que você viu no Básico, agora usada dentro da expressão da compreensão.
- E se um aluno tiver a lista de notas vazia?
- A divisão sum([]) / len([]) daria erro de divisão por zero, porque len seria 0. Em dados reais, você trataria esse caso antes, filtrando alunos sem notas ou usando uma condição. Neste exercício os dados são controlados, mas é bom ter o cuidado em mente para projetos de verdade.
- Por que usar round na média do dicionário final?
- Só para a saída ficar limpa, com uma casa decimal, já que 7.333... polui a leitura. round(valor, 1) arredonda para uma casa. É uma escolha de apresentação; se você precisar da média exata para outra conta, guarde o valor completo e arredonde só ao mostrar.
- Esse padrão de filtrar, mapear e resumir é comum mesmo?
- Muito. É a espinha dorsal de quase todo processamento de dados: pegar uma coleção, ficar só com o que interessa, transformar em outro formato e resumir. Você vai repeti-lo com JSON, CSV e respostas de serviços ao longo do curso. Dominá-lo com compreensões economiza um bocado de código.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.