Como referenciar este texto: Python: frequência em uma lista — guia prático para professores. Rodrigo Terra. Publicado em: 27/12/2025. Link da postagem: https://www.makerzine.com.br/educacao/python-frequencia-em-uma-lista-guia-pratico-para-professores/.
Apresento alternativas que vão desde abordagens nativas até bibliotecas como collections e pandas, com ênfase em complexidade, desempenho e exercícios para promover pensamento computacional em alunos.
Ao final, encontrará sugestões de atividades, variações para lidar com textos e dicas para transformar esse conteúdo em avaliações autênticas e colaborativas.
Por que ensinar frequência em listas?
Relevância pedagógica: contar elementos aproxima os estudantes de problemas reais — análise de votos, palavras em textos, respostas de pesquisa e logs. Além de ser um conceito acessível, permite mostrar como pequenas observações sobre dados se transformam em insights úteis para tomada de decisão e investigação.
Na prática de ensino, esse tema funciona bem como atividade inicial para trabalhar limpeza de dados (normalização de caixa, remoção de pontuação), tokenização e representação tabular. Professores podem propor atividades curtas que envolvam coleta de exemplos, construção de tabelas de frequência e interpretação de resultados, conectando programação e estatística descritiva.
No plano técnico, é oportunidade para comparar abordagens em Python: uso direto de list.count em situações simples, acumulação manual com dicionários para eficiência, collections.Counter para conveniência e pandas.value_counts() quando se trabalha com séries ou grandes conjuntos. Vale discutir complexidade: repetir list.count em um laço pode levar a comportamento quadrático, enquanto um único percurso com dict/Counter costuma ser linear.
Para consolidar, proponha exercícios e variações que estimulem pensamento computacional:
- contar palavras em um texto e gerar uma tabela ordenada por frequência;
- comparar distribuições entre duas turmas ou períodos;
- implementar função que retorne top-k itens mais frequentes;
- testar desempenho com diferentes volumes de dados e avaliar trade-offs.
Atividades colaborativas, visualizações simples (barras, nuvens de palavras) e desafios de depuração tornam o conteúdo mais significativo e avaliam compreensão conceitual além da sintaxe.
Métodos nativos do Python
Alternativas simples: usar list.count em um loop é direto e fácil de explicar — por exemplo, para cada item em uma lista fazer counts[item] = lista.count(item). Essa abordagem é intuitiva para iniciantes, mas tem custo O(n²) no pior caso, porque list.count percorre a lista inteira a cada chamada. Em contraste, construir um dicionário e incrementar contadores em um único percurso tem custo O(n) e é a solução recomendada para listas maiores ou quando desempenho importa.
Exemplo conceitual: percorra a lista e faça counts[item] = counts.get(item, 0) + 1. Essa linha ilustra duas ideias importantes: uso de um dicionário como mapa de contagem e a técnica de recuperar um valor padrão com dict.get. Ao apresentar esse padrão em sala, peça aos alunos que tracem o custo por iteração e expliquem por que essa solução é linear.
Outra alternativa nativa útil é combinar set e compreensão de dicionário: {x: lista.count(x) for x in set(lista)}. Isso reduz o número de chamadas a list.count para o número de elementos únicos, mas o custo ainda será O(k·n) (k = número de únicos). Discuta com os alunos o trade-off entre clareza e eficiência e quando cada padrão pode ser adequado dependendo do tamanho da entrada e da proporção de elementos repetidos.
Detalhes práticos: conte elementos somente quando forem hashable — objetos mutáveis como listas não podem ser chaves de dicionário. Mostre como normalizar dados antes de contar (por exemplo, converter strings para minúsculas para contagens case-insensitive) e como tratar valores nulos. Também vale mencionar que, desde Python 3.7, dicionários preservam a ordem de inserção, o que pode ser útil se quiser manter a ordem de primeira ocorrência ao construir o mapa de frequências.
Sugestões didáticas: proponha exercícios curtos onde alunos implementam ambas as abordagens e meçam tempo para diferentes tamanhos/variedade de dados; peça que expliquem resultado e complexidade. Como variações, peça que contem ocorrências condicionais (por exemplo, apenas palavras com mais de N letras) ou que extraiam uma chave de estruturas mais complexas (lista de dicionários) antes de contar. Esses exercícios consolidam raciocínio sobre estruturas nativas e análise de desempenho.
collections.Counter em sala de aula
Counter fornece uma API direta: Counter(lista) e most_common(n) para os itens mais frequentes. É eficiente e legível para iniciantes, permitindo que professores mostrem resultados úteis com poucas linhas de código e foco na interpretação dos dados em vez de detalhes de implementação.
No contexto de sala de aula, é valioso usar exercícios de pares para explorar variações: ordenação por frequência, filtragem por um limite mínimo e visualização rápida com barras. Proponha pequenas modificações — por exemplo, contar palavras em vez de itens, normalizar caixa (lowercase) e excluir pontuação — para que os alunos vejam como pré-processamento afeta os resultados.
Uma sequência de atividades típica pode incluir: 1) coletar uma lista curta (respostas de alunos, palavras de um parágrafo), 2) gerar um Counter e inspecionar most_common(5), 3) aplicar filtros (remover stopwords) e 4) comparar dois conjuntos usando operações de Counter. Esses passos funcionam bem como avaliação formativa curta: peça que cada dupla explique o porquê das diferenças entre duas listas.
Algumas dicas práticas: explique métodos úteis como update() para agregar contagens de várias fontes e subtract() para subtrair uma lista de referência; demonstre como combinar Counters com + para somar frequências ou & para interseção. Para classes mais avançadas, mostre integração com pandas e matplotlib para transformar contagens em tabelas e gráficos simples, e discuta desempenho ao lidar com grandes volumes de texto, incentivando amostragens e processamento incremental.
Outras abordagens: pandas e numpy
Para turmas que já conhecem bibliotecas, pandas.Series.value_counts() e numpy.unique(return_counts=True) são opções poderosas para trabalhar com conjuntos maiores e tabelas. Essas funções oferecem contagem rápida de valores, ordenação e parâmetros adicionais como normalização (proporções) e exclusão de valores nulos, o que facilita análises exploratórias sem escrever laços explícitos.
É importante mostrar quando migrar para essas bibliotecas: quando os dados vêm em formato tabular (DataFrame), quando há necessidade de agrupar por colunas distintas ou combinar contagens com estatísticas descritivas, e quando se espera integração com visualizações e pipelines de análise. Em especial, DataFrame.groupby() e pivot_table() ampliam o poder de value_counts para análises por subgrupos.
Do ponto de vista pedagógico, destaque diferenças práticas: numpy foca em arrays e performance numérica, sendo ótimo para vetores homogêneos; pandas oferece estrutura etiquetada, tratamento de dados faltantes e métodos convenientes para manipulação de séries e tabelas. Mostre exemplos curtos em sala comparando uma solução com dicionário e outra com pandas, para que os alunos percebam ganhos de legibilidade e desempenho em conjuntos maiores.
Também vale discutir trade-offs: o custo de importar dependências e o consumo de memória versus a legibilidade e velocidade das operações vetorizadas. Proponha atividades em que a turma meça tempos com listas grandes, compare resultados e documente escolhas. Por fim, sugira exercícios que comecem com abordagens nativas e escalem para pandas/numpy, promovendo compreensão conceitual antes da abstração das bibliotecas.
Análise de texto e pré-processamento
Ao contar palavras em textos, é fundamental normalizar a caixa (lower()), remover pontuação e tratar caracteres especiais para reduzir ruído. Use também normalização Unicode (por exemplo, NFKC/NFKD) para juntar formas equivalentes e evitar que acentos ou diferentes representações de caracteres fragmentem contagens. Decisões nesse estágio determinam se “café”, “Cafe” e “CAFÉ” serão contados como a mesma palavra.
A tokenização precisa ser consistente: escolha entre separar por espaços, usar expressões regulares ou bibliotecas robustas (NLTK, spaCy) que tratam contrações e sinais de pontuação. Considere se símbolos como emojis, hashtags e URLs devem ser preservados ou removidos — em algumas análises eles carregam informação importante e, em outras, atrapalham a comparação direta de frequências.
Stopwords, stemming e lematização alteram fortemente o resultado final. Remover stopwords reduz o volume mas pode apagar sinais relevantes dependendo da tarefa; o stemming é rápido e rústico, enquanto a lematização mantém formas canônicas mais precisas. Explique a diferença a estudantes comparando contagens de tokens brutos versus tokens lematizados para mostrar como o pré-processamento muda rankings e interpretações.
Trate também de casos práticos: normalizar números (ex.: mapear datas e valores para um token único), preservar ou juntar expressões compostas (n-grams) quando fizer sentido, e registrar cada passo para reproduzibilidade. Use o Counter para contagens simples e pandas.value_counts() para integrações com análise tabular, sempre documentando transformações aplicadas.
Em sala, proponha atividades comparativas — por exemplo, contar frequências antes e depois de remover pontuação, ou comparar resultados com e sem lematização — e peça aos alunos que interpretem as diferenças. Essas tarefas ilustram como escolhas de pré-processamento introduzem vieses e influenciam conclusões, além de reforçar boas práticas como experimentação controlada e registro de pipeline.
Atividades e avaliação formativa
Proponha um conjunto de atividades que contemple níveis variados de dificuldade. Um desafio central é a otimização: peça para os alunos converterem uma solução O(n²) em O(n) para contar frequências, discutindo por que a mudança melhora o desempenho. Outra tarefa possível é um mini-projeto de análise de feedbacks de alunos, em que os participantes devem limpar textos, contar ocorrências de palavras-chave e extrair insights simples. Finalize com uma oficina prática de visualização de frequências, usando gráficos de barras ou nuvens de palavras para representar resultados de forma clara.
Para avaliação, use rubricas claras que cubram aspectos técnicos e comunicativos. Critérios sugeridos: correção algorítmica (o código produz os resultados esperados), análise de complexidade (os alunos justificam a eficiência), apresentação dos resultados (visualização e clareza) e reflexão pedagógica (como os dados informam decisões de ensino). Atribua níveis de desempenho (ex.: Insuficiente/Em Desenvolvimento/Satisfatório/Avançado) e exemplos de evidências para cada nível, facilitando feedback objetivo e acionável.
Incorpore práticas formativas durante as atividades: checkpoints rápidos, quizzes de conceito e pares de revisão de código. Use casos de teste automatizados como ferramenta de feedback imediato e incentive a escrita de testes simples que validem contagens e exclusões. Promova a autoavaliação e a revisão entre colegas para consolidar o aprendizado, além de breves sessões de depuração orientada pelo professor para corrigir equívocos comuns sobre estruturas de dados e complexidade.
Ofereça diferenciações e extensões para alunos com ritmos distintos. Para iniciantes, forneça snippets orientadores e exercícios guiados; para avançados, proponha variações como contagem em streams de dados, normalização de textos (stemming/lemmatização) ou processamento de grandes corpora com pandas. Indique recursos e bibliotecas úteis (por exemplo, collections.Counter e pandas) e sugira como transformar essas atividades em avaliações autênticas: projetos colaborativos, portfólios de código e apresentações curtas com visualizações.