Pular para o conteúdo

Como Usar a OrderedDict do Python?

[

OrderedDict vs dict in Python: A escolha certa para o trabalho

Escolhendo entre OrderedDict e dict

Durante muito tempo, os dicionários em Python eram estruturas de dados não ordenadas. Os desenvolvedores de Python estavam acostumados com isso e recorriam a listas ou outras sequências quando precisavam manter seus dados ordenados. Com o passar do tempo, os desenvolvedores sentiram a necessidade de um novo tipo de dicionário que mantivesse a ordem dos itens.

Em 2008, a PEP 372 introduziu a ideia de adicionar uma nova classe de dicionário à biblioteca collections. Seu principal objetivo era lembrar a ordem dos itens conforme definida pela ordem de inserção das chaves. Foi assim que surgiu o OrderedDict.

Os desenvolvedores principais do Python queriam preencher essa lacuna e fornecer um dicionário que pudesse preservar a ordem das chaves inseridas. Isso permitiria uma implementação mais simples e direta de certos algoritmos e estruturas de dados. Portanto, o OrderedDict foi adicionado à biblioteca collections do Python.

Hoje em dia, o Python 3.6 introduziu uma mudança relevante: a classe dict padrão também mantém a ordem dos itens. Isso ocorre porque a implementação interna do dict agora usa uma tabela de hash que preserva a ordem de inserção. Isso levantou a seguinte pergunta: o OrderedDict ainda é útil ou podemos usar o dict padrão?

Neste tutorial, vamos explorar as características únicas do OrderedDict e discutir os cenários em que ele ainda é útil, em comparação com o dict. Vamos aprender a criar e usar objetos OrderedDict em seu código e entender as vantagens e desvantagens de usar o OrderedDict versus o dict.

Com esse conhecimento, você será capaz de escolher a classe de dicionário que melhor se adapta às suas necessidades e preservar a ordem dos itens quando necessário.

Começando com o OrderedDict do Python

Criando objetos OrderedDict

Para começar, vamos aprender a criar objetos OrderedDict. A criação de um objeto OrderedDict é semelhante à criação de um dict:

from collections import OrderedDict
ordered_dict = OrderedDict()

No entanto, a principal diferença é que o OrderedDict preserva a ordem dos elementos conforme eles são inseridos. Vamos ver um exemplo:

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict['B'] = 2
ordered_dict['C'] = 3
print(ordered_dict)

A saída será:

OrderedDict([('A', 1), ('B', 2), ('C', 3)])

Observe como os elementos são mostrados na ordem em que foram inseridos. A capacidade de manter a ordem dos itens por inserção é uma das principais vantagens do OrderedDict.

Gerenciando itens em um OrderedDict

Agora que sabemos como criar um OrderedDict, vamos aprender a gerenciar os itens em um OrderedDict. Podemos adicionar, remover e atualizar itens em um OrderedDict, assim como faríamos com um dict.

Adicionando itens

Para adicionar itens a um OrderedDict, podemos usar a mesma sintaxe que usaríamos com um dict:

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict['B'] = 2

Podemos adicionar um único item ou vários itens de uma vez.

Removendo itens

Podemos remover itens de um OrderedDict usando o método pop():

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict['B'] = 2
ordered_dict.pop('A')

Isso removerá o item com a chave 'A' do OrderedDict.

Atualizando itens

Podemos atualizar os valores dos itens existentes em um OrderedDict simplesmente atribuindo um novo valor à chave correspondente:

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict['B'] = 2
ordered_dict['A'] = 100

A chave 'A' agora terá o valor 100.

Iterando sobre um OrderedDict

Um dos benefícios do OrderedDict é que ele preserva a ordem dos itens ao iterar sobre eles. Podemos fazer isso usando um loop for:

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict['B'] = 2
ordered_dict['C'] = 3
for key, value in ordered_dict.items():
print(f'Chave: {key}, Valor: {value}')

A saída será:

Chave: A, Valor: 1
Chave: B, Valor: 2
Chave: C, Valor: 3

Observe como os itens são mostrados na ordem em que foram inseridos. Isso pode ser útil quando precisamos manter uma lógica específica com base na ordem dos itens.

Iterando em ordem reversa com reversed()

Outra vantagem do OrderedDict é que podemos iterar sobre os itens em ordem reversa usando a função reversed():

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict['B'] = 2
ordered_dict['C'] = 3
for key, value in reversed(ordered_dict.items()):
print(f'Chave: {key}, Valor: {value}')

A saída será:

Chave: C, Valor: 3
Chave: B, Valor: 2
Chave: A, Valor: 1

Isso pode ser útil quando precisamos percorrer os itens em ordem inversa.

Explorando as características únicas do OrderedDict do Python

O OrderedDict do Python possui algumas características exclusivas que o diferenciam do dict padrão. Vamos explorar algumas delas aqui.

Reordenando itens com .move_to_end()

Um dos recursos exclusivos do OrderedDict é a capacidade de reordenar itens usando o método move_to_end(). Esse método move um item existente para o final do OrderedDict. Vamos ver um exemplo:

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict['B'] = 2
ordered_dict['C'] = 3
ordered_dict.move_to_end('A')
print(ordered_dict)

A saída será:

OrderedDict([('B', 2), ('C', 3), ('A', 1)])

Observe como o item com a chave 'A' agora está no final do OrderedDict. Isso pode ser útil quando precisamos alterar a ordem dos itens com base em alguma lógica específica.

Removendo itens com .popitem()

Outra funcionalidade útil do OrderedDict é a capacidade de remover o último item inserido usando o método popitem():

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict['B'] = 2
ordered_dict['C'] = 3
ordered_dict.popitem()
print(ordered_dict)

A saída será:

OrderedDict([('A', 1), ('B', 2)])

Observe como o item com a chave 'C' foi removido do OrderedDict.

Testar igualdade entre dicionários

Podemos usar o operador de igualdade == para verificar se dois dicionários são iguais. No entanto, a ordem dos itens em um dict não é levada em consideração durante essa comparação.

No entanto, no OrderedDict, a ordem dos itens é levada em consideração ao comparar dois dicionários. Vamos ver um exemplo:

from collections import OrderedDict
ordered_dict1 = OrderedDict()
ordered_dict1['A'] = 1
ordered_dict1['B'] = 2
ordered_dict2 = OrderedDict()
ordered_dict2['B'] = 2
ordered_dict2['A'] = 1
print(ordered_dict1 == ordered_dict2)

A saída será False, porque a ordem dos itens é diferente nos dois OrderedDicts.

Adicionando novos atributos a uma instância de dicionário

Uma outra característica interessante do OrderedDict é a capacidade de adicionar novos atributos a uma instância de dicionário. Vamos ver um exemplo:

from collections import OrderedDict
ordered_dict = OrderedDict()
ordered_dict['A'] = 1
ordered_dict.new_attribute = 'New Attribute'
print(ordered_dict.new_attribute)

A saída será 'New Attribute'. Isso permite uma flexibilidade adicional ao trabalhar com OrderedDicts.

Mesclando e atualizando dicionários com operadores

Podemos mesclar e atualizar dicionários usando operadores como + e |. No entanto, precisamos ter cuidado ao usar esses operadores com OrderedDicts e dicts regulares.

Vamos ver um exemplo:

from collections import OrderedDict
ordered_dict1 = OrderedDict()
ordered_dict1['A'] = 1
ordered_dict1['B'] = 2
ordered_dict2 = OrderedDict()
ordered_dict2['C'] = 3
ordered_dict2['D'] = 4
merged_dict = ordered_dict1 + ordered_dict2

Ao executar esse código, você obterá um erro, pois o operador + não está definido para OrderedDicts.

No entanto, podemos usar o operador | para mesclar dois OrderedDicts:

merged_dict = ordered_dict1 | ordered_dict2

Agora, merged_dict será um OrderedDict que contém os itens de ambos os dicionários mesclados na ordem correta.

Podemos usar os mesmos operadores para mesclar e atualizar um OrderedDict com um dict regular. O resultado será um OrderedDict. Vamos ver um exemplo:

regular_dict = {'C': 3, 'D': 4}
merged_dict = ordered_dict1 | regular_dict

O merged_dict neste caso será um OrderedDict, preservando a ordem dos itens.

Considerando o desempenho

Quando se trata de desempenho, o OrderedDict tem um custo adicional em relação ao dict padrão. Isso ocorre porque o OrderedDict precisa manter a ordem dos itens usando uma estrutura de dados extra, enquanto o dict padrão não precisa fazer isso.

No entanto, em muitos casos, a diferença de desempenho é insignificante. A menos que você esteja trabalhando com uma grande quantidade de itens ou precise otimizar a velocidade em um cenário específico, a diferença de desempenho entre OrderedDict e dict provavelmente não será um problema. Se você está apenas preocupado em manter a ordem dos itens, o custo adicional de desempenho do OrderedDict pode ser aceitável.

Escolhendo o dicionário certo para o trabalho

Ao escolher entre OrderedDict e dict, você deve considerar as necessidades específicas do seu projeto. Aqui estão algumas perguntas que você pode fazer:

  • Você precisa manter a ordem dos itens em um dicionário?
  • Você precisa iterar sobre os itens de um dicionário na ordem em que foram inseridos?
  • Você precisa reordenar ou remover itens de um dicionário com base em alguma lógica específica?
  • O desempenho é crítico no seu projeto?

Se você respondeu “sim” a alguma dessas perguntas, o OrderedDict pode ser a escolha certa para o seu projeto. Caso contrário, o dict padrão provavelmente atenderá às suas necessidades.

Construindo uma fila baseada em dicionário

Agora que entendemos as características do OrderedDict, podemos ver um exemplo prático de como ele pode ser usado para criar uma fila baseada em dicionário. Vamos implementar uma fila simples usando OrderedDict:

from collections import OrderedDict
class DictionaryQueue:
def __init__(self):
self.queue = OrderedDict()
def enqueue(self, key, value):
self.queue[key] = value
def dequeue(self):
return self.queue.popitem(last=False)
def is_empty(self):
return len(self.queue) == 0

Nesta implementação, usamos um OrderedDict para armazenar os itens da fila. Ao adicionar um novo item à fila, nós o inserimos no final do OrderedDict. Ao remover itens da fila, usamos popitem() para remover o item no início da fila, que é sempre o primeiro item inserido.

Essa implementação nos permite manter a ordem dos itens na fila e oferece métodos simples para adicionar e remover itens da fila.

Conclusão

Neste tutorial, exploramos as diferenças entre OrderedDict e dict em Python. Embora o dict padrão tenha sido atualizado para manter a ordem dos itens, o OrderedDict ainda oferece recursos exclusivos que podem ser úteis em determinadas situações.

Agora você tem o conhecimento necessário para escolher a classe de dicionário que melhor atende às suas necessidades. Se você precisa manter a ordem dos itens ou realizar operações específicas de reordenação ou remoção, considere usar OrderedDict. Caso contrário, o dict padrão provavelmente será suficiente.

Espero que este tutorial tenha sido útil para entender as diferenças e escolher a classe de dicionário certa para o trabalho. Agora você pode aproveitar ao máximo o poder dos dicionários em Python!