✅ Artigo atualizado em Setembro 2026 Corrigimos o exemplo de fila com
deque(FIFO de verdade, comappend+popleft), a comparação com odict(que preserva a ordem de inserção desde o Python 3.7) e conferimos as saídas no Python 3.13.
Salve salve Pythonista!
As estruturas de dados são elementos fundamentais na programação e desempenham um papel crucial na eficiência e organização do código.
A biblioteca padrão do Python possui um módulo chamado collections, que traz um conjunto de estruturas de dados especializadas que complementam os tipos embutidos (list, dict, tuple e set).
Como ele faz parte da biblioteca padrão, não é preciso instalar nada: basta um from collections import ....
Neste artigo, abordaremos as estruturas de dados mais utilizadas do pacote collections do Python e como elas podem auxiliar no desenvolvimento de aplicações mais eficientes e flexíveis.
Vá Direto ao Assunto…
- A Collection
defaultdict - A Collection
Counter - A Collection
deque - A Collection
namedtuple - A Collection
OrderedDict
Antes de explorarmos as estruturas de dados disponíveis no pacote collections, é importante destacar que esse módulo oferece alternativas especializadas para as estruturas embutidas do Python, como listas e dicionários.
Cada uma resolve melhor um caso específico: contar elementos, criar valores padrão, inserir e remover nas duas pontas de uma sequência, e assim por diante.
A Collection defaultdict
Uma das estruturas de dados mais utilizadas do pacote collections é o defaultdict.
Diferente do dicionário tradicional, o defaultdict aceita uma função que será chamada quando um valor não existir.
Por exemplo, se tentarmos acessar um elemento que não está presente no dicionário, em vez de lançar um KeyError, o defaultdict irá criar o elemento utilizando a função especificada.
1
2
3
4
from collections import defaultdict
dicionario = defaultdict(int)
dicionario['chave'] += 1
Nesse exemplo, o dicionário dicionario utiliza a função int como padrão para os valores que não foram inicializados previamente.
Caso a chave não exista, o valor será inicializado como 0.
Dessa forma, podemos incrementar o valor de dicionario['chave'] mesmo sem ter atribuído um valor inicial a ele.
Está curtindo esse conteúdo? ![]()
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
A Collection Counter
Outra estrutura de dados interessante é o Counter, que permite contar elementos em uma lista ou qualquer objeto iterável.
Esse contador é implementado como um dicionário de contadores, onde cada elemento é mapeado para uma contagem.
1
2
3
4
5
from collections import Counter
lista = ['a', 'b', 'c', 'a', 'b', 'a']
contador = Counter(lista)
print(contador)
A saída será:
1
Counter({'a': 3, 'b': 2, 'c': 1})
O Counter também oferece métodos úteis, como a possibilidade de encontrar os elementos mais comuns, remover ou adicionar elementos.
A Collection deque
Um tipo de estrutura de dados frequente na programação é a fila (que também pode ser gerenciada com a biblioteca queue), que segue o princípio FIFO (First In, First Out).
O pacote collections oferece a classe deque (double-ended queue, ou “fila de duas pontas”), que permite inserir e remover elementos nas duas extremidades de forma eficiente.
Para montar uma fila FIFO, inserimos no final com append e removemos do início com popleft:
1
2
3
4
5
6
7
8
9
10
11
from collections import deque
fila = deque()
fila.append('Cliente 1')
fila.append('Cliente 2')
fila.append('Cliente 3')
print(fila)
atendido = fila.popleft()
print(atendido)
print(fila)
A saída será:
1
2
3
deque(['Cliente 1', 'Cliente 2', 'Cliente 3'])
Cliente 1
deque(['Cliente 2', 'Cliente 3'])
Perceba que o primeiro cliente a entrar (Cliente 1) foi o primeiro a sair: esse é o comportamento FIFO.
No deque, append, appendleft, pop e popleft custam aproximadamente O(1), ou seja, inserir ou remover em qualquer uma das pontas é igualmente rápido. A vantagem aparece na comparação com a lista: em uma list, pop(0) e insert(0, valor) custam O(n), porque todos os outros elementos precisam ser deslocados.
Também dá para fazer FIFO no sentido contrário (appendleft para inserir e pop para remover); o importante é inserir por uma ponta e remover pela outra.
Cada Collection dessas resolve um problema real de estrutura de dados, e reconhecer qual usar vem só com prática. Isso é parte do que trabalhamos na Jornada Python, do zero ao avançado:
A Collection namedtuple
Outra estrutura de dados muito útil é o namedtuple, um subtipo de tupla que atribui nomes fixos aos elementos.
Com o namedtuple, podemos criar uma classe de tupla personalizada sem a necessidade de criar uma classe completa.
1
2
3
4
5
6
from collections import namedtuple
Pessoa = namedtuple('Pessoa', ['nome', 'idade'])
p1 = Pessoa('João', 25)
print(p1.nome) # João
print(p1.idade) # 25
Aqui, criamos um namedtuple chamado Pessoa com os campos nomee idade.
Em seguida, instanciamos esse tipo de dado e atribuímos valores aos seus campos.
Por fim, podemos acessar esses campos como atributos da instância.
Criei o Ebookr.ai, uma plataforma que usa IA para gerar ebooks profissionais sobre qualquer tema - com capa gerada por IA, infográficos automáticos e exportação em PDF. Confere!
A Collection OrderedDict
Por fim, temos o OrderedDict, uma variante do dicionário padrão que mantém a ordem dos elementos de acordo com a inserção.
Vale um esclarecimento: desde o Python 3.7, o dict comum também garante a ordem de inserção. Por isso o OrderedDict perdeu parte da importância, mas ainda tem recursos próprios para quem precisa reordenar elementos.
1
2
3
4
5
6
from collections import OrderedDict
dicionario = OrderedDict()
dicionario['chave1'] = 1
dicionario['chave2'] = 2
print(dicionario)
A saída será (no Python 3.12 ou mais recente):
1
OrderedDict({'chave1': 1, 'chave2': 2})
Em versões anteriores ao 3.12, a representação aparece como OrderedDict([('chave1', 1), ('chave2', 2)]); o conteúdo é o mesmo.
Como o dict comum já preserva a ordem de inserção, hoje o OrderedDict faz sentido quando você precisa das operações extras dele, como move_to_end(), popitem(last=False) e a comparação de igualdade que leva a ordem em conta:
1
2
3
4
5
6
7
8
9
from collections import OrderedDict
d = OrderedDict(a=1, b=2, c=3)
d.move_to_end('a')
print(list(d))
print(d.popitem(last=False))
print({'x': 1, 'y': 2} == {'y': 2, 'x': 1})
print(OrderedDict(x=1, y=2) == OrderedDict(y=2, x=1))
A saída será:
1
2
3
4
['b', 'c', 'a']
('b', 2)
True
False
Conclusão
O pacote collections da biblioteca padrão do Python oferece uma gama de estruturas de dados que complementam os tipos embutidos, trazendo alternativas especializadas para listas, dicionários e outros tipos de dados.
Neste artigo, apresentamos algumas das estruturas de dados mais utilizadas, como o defaultdict, Counter, deque, namedtuple e OrderedDict.
Ao utilizar essas estruturas de dados, é possível melhorar a eficiência do código e deixar o código mais legível e organizado. Com o defaultdict, podemos evitar o uso de condicionais para verificar a existência de chaves em dicionários.
O Counter facilita a contagem de elementos em listas e objetos iteráveis.
O deque oferece inserção e remoção rápidas nas duas pontas, ideal para filas.
O namedtuple permite a criação de classes de tuplas personalizadas de forma mais simples.
E o OrderedDict, embora o dict comum já preserve a ordem de inserção desde o Python 3.7, continua útil quando você precisa reordenar elementos com move_to_end() ou comparar dicionários levando a ordem em conta.
Portanto, conhecer e utilizar as estruturas de dados disponíveis no pacote collections do Python é fundamental para programadores que desejam desenvolver aplicações mais eficientes e organizadas.
Experimente essas estruturas de dados e aproveite ao máximo seus recursos.
Quer praticar essas estruturas e o resto da base do Python em projetos guiados? Conheça a Jornada Python, nosso curso de Python completo.
"Porque o Senhor dá a sabedoria, e da sua boca vem a inteligência e o entendimento" Pv 2:6