Tipos de dicionário em Python

Conhecendo um pouco mais sobre as variedades de dict

Álvaro Ferreira Pires de Paiva
4 min readMar 21, 2020

A intenção desse artigo é apresentar ao leitor mais opções de dicionários presentes na linguagem Python, opções essas que são implementadas como subclasses do dict e são bastante úteis nos casos para os quais foram pensados.

Primeiro irei fazer um breve resumo sobre dict e relembrar algumas funções básicas do mesmo. Após, irei apresentar os seguintes tipos de dicionários encontrados no módulo collections:

  • Counter: problemas relacionados a contagem.
  • OrderedDict: problemas relacionados a ordenação do dicionário em versões antigas do Python.
  • defaultdict: problemas de valores padrões para elementos não mapeados no dicionário.

Estou usando a documentação do Python 3.8. Os códigos aqui encontrados ou foram retirados da documentação oficial ou eu mesmo escrevi.

Algumas partes do artigo podem abordar assuntos mais avançadas, portanto deixarei o máximo possível de links auxiliares durante o texto.

Um breve resumo sobre dict

Dicionário é uma estrutura abstrata de dado mutável bastante utilizado em Python. Comumente chamado de array associativo em outras linguagens, os dicionários implementam mapeamentos, ou seja, realizam uma associação entre pares de valores, o primeiro elemento do par é a chave e o segundo é o conteúdo/valor.

Existem várias formas de declarar um dict:

Para acessar um conteúdo, basta escrever a chave que esta associado a ele dentro de colchetes ([]), exemplo: a['three'] retorna o valor 3. Caso você não tenha certeza se aquela chave existe no dicionário, você pode fazer uma das seguintes formas:

Outras coisas sobre dicionários:

  • Adicionando novo item: your['new_key'] = new_value
  • Removendo item: del your_dict['key'] ou your_dict.pop('key', 'default value')
  • Juntando dois dicionários: your_dict.update(other_dict)
  • Pegando as chaves: your_dict.keys()
  • Pegando os valores: your_dict.values()
  • Pegando os pares: your_dict.items()

E algo bastante útil: compreensão de dicionário. Digamos que você seja um sindico de condomínio e tem que aplicar um aumento de 10% de aluguel de todos os condôminos. A chave representa o apartamento e o valor representa o aluguel. Uma forma mais concisa de escrever essa iteração é usando a compreensão de dicionário, exemplo:

Counter

Um Counter é uma subclasse de dict usada para contagem (meio obvio pelo nome, eu sei). Os elementos são armazenados como as chaves e seus valores são a quantidade de ocorrência do mesmo, aceitando qualquer valor inteiro, incluindo zero e números negativos.

Agora imagine o cenário que você tem que contabilizar a quantidade de ocorrências das palavras em um texto. Para ilustrar melhor, usaremos um trava-línguas a seguir:

Com os Counters gerados, podemos, por exemplo, ver as maiores ocorrências de letras e palavras:

Outra utilidade para o Counter é na utilização de operações envolvendo alguns conjuntos. Exemplo: digamos que você queira checar se um conjunto de letras é subconjunto de uma palavra, ou seja, todas as letras estão presentes na palavra com a mesma quantidade, independente de ordem. Um exemplo de resolução para isso seria:

Vale observar duas coisas no código anterior: a primeira é que estamos usando o operador & que consiste em realizar a intersecção entre os Counters; a segunda é a compreensão de lista, funciona semelhante a compreensão de dicionário, porém sem atribuição de chaves para os valores.

Algo interessante no Counter é que caso você tente acessar um elemento até agora não contabilizado por ele, não resultará em uma exceção de KeyError, ao invés disso será retornado o valor 0.

OrderedDict

A principal utilidade desse dicionário é garantir a ordem através da inserção. Nas versões anteriores a Python 3.7, o dicionário comum não garante ordem por inserção, ou seja, se você inserir os pares [('a', 'val_1'), ('b', 'val_2'), ('c', 'val_3')], pode ocorrer de virem em uma outra ordem aleatória nos momentos que você queira iterar. Esse é um cuidado que você deve tomar caso mexa com versões de Python mais antigas.

Uma ressalva sobre o OrderedDict é que ele, no geral, é mais pesado e lento que os outros dicionários, dessa forma, deve-se procurar utilizar apenas quando seus algoritmos realmente exijam ordem ou seja custoso demais realizar uma ordenação sobre as variáveis, além de, novamente, verificar se é uma versão de Python antiga).

defaultdict

Defaultdict são dicionários que possibilitam você atribuir um valor padrão quando tentar acessar uma chave que não existe, isso a partir do default factory passado em seu construtor.

Imagine o cenário que você está analisando uma lista de imóveis, aí para cada tipo você tem um valor associado, sendo que como a lista é realmente grande, você não consegue ter todos os tipos mapeados (ou simplesmente não quer). Dessa forma você decide atribuir um valor padrão para todos os tipos não mapeados:

Uma observação importante é notar que você pode colocar um lambda como default factory no defaultdict (como mostrado no código anterior). Caso nada seja atribuído como default factory, o defaultdict se comporta igual a um dict normal.

Outra observação é que o defaultdict não apenas retorna o valor padrão estabelecido, como ele também cria a chave associando ao valor atribuído (no caso, o valor padrão). No exemplo do código anterior, se dermos um print(switch_dict) poderemos verificar que o valor do nosso defaultdict é {'Apartament':125, 'House':250, 'Condominium': 300, 'Treehouse':900, 'Hotel':900}, não mais apenas os 3 valores associados inicialmente.

Conclusão

O dict nos proporciona organização perante os dados e resolução sobre problemas relacionados a associação entre chave e valor, porém é interessante aumentarmos o nosso conhecimento para as diferentes aplicações que ele possui, gerando subclasses para a resolução de casos específicos como contagem (Counter), ordem (OrderedDict) e valores padrões (defaultdict).

Além dessas estruturas, você pode dar uma olhada no meu repositório alvarofpp/python-adt-extension no GitHub, no qual procuro expandir as estruturas de dados do Python para aplicá-las em diferentes casos, um exemplo é a classe SwitchDict que funciona como um defaultdict, porém mais mutável quanto aos valores padrões.

As referências que utilizei estão espalhadas pelo texto no formato de links.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Álvaro Ferreira Pires de Paiva
Álvaro Ferreira Pires de Paiva

No responses yet

Write a response