Pular para o conteúdo

Descubra como usar defaultdict em Python

[

Usando o tipo defaultdict do Python para lidar com chaves ausentes

Um problema comum que pode surgir ao trabalhar com dicionários em Python é tentar acessar ou modificar chaves que não existem no dicionário. Isso resultará em um KeyError e interromperá a execução do seu código. Para lidar com esse tipo de situação, a biblioteca padrão fornece o tipo defaultdict do Python, que é uma classe semelhante a um dicionário e está disponível no módulo collections.

O tipo defaultdict do Python se comporta quase exatamente como um dicionário Python comum, mas se você tentar acessar ou modificar uma chave ausente, o defaultdict criará automaticamente a chave e gerará um valor padrão para ela. Isso torna o defaultdict uma opção valiosa para lidar com chaves ausentes em dicionários.

Neste tutorial, você aprenderá:

  • Como usar o tipo defaultdict do Python para lidar com chaves ausentes em um dicionário
  • Quando e por que usar um defaultdict do Python em vez de um dicionário comum
  • Como usar um defaultdict para operações de agrupamento, contagem e acumulação

Com esse conhecimento, você estará em uma melhor condição para usar efetivamente o tipo defaultdict do Python em seus desafios de programação diários.

Lidando com chaves ausentes em dicionários

Um problema comum que pode surgir ao trabalhar com dicionários Python é como lidar com chaves ausentes. Se o seu código depende muito de dicionários, ou se você está criando dicionários constantemente, em breve perceberá que lidar com exceções frequentes de KeyError pode ser bastante irritante e adicionar complexidade adicional ao seu código. Com os dicionários Python, você tem pelo menos quatro maneiras disponíveis para lidar com chaves ausentes:

  1. Usando a estrutura de controle if para verificar se a chave existe antes de acessá-la ou modificá-la:
my_dict = {}
if 'key' in my_dict:
value = my_dict['key']
else:
value = None
  1. Usando o método get() do dicionário, que retorna um valor padrão se a chave não existir:
my_dict = {}
value = my_dict.get('key', None)
  1. Usando o método setdefault() do dicionário, que retorna o valor atual da chave ou define um valor padrão se a chave não existir:
my_dict = {}
value = my_dict.setdefault('key', None)
  1. Usando o tipo defaultdict do Python:
from collections import defaultdict
my_dict = defaultdict(lambda: None)
value = my_dict['key']

Entendendo o tipo defaultdict do Python

O tipo defaultdict é uma classe fornecida pelo módulo collections do Python. Ele funciona de forma semelhante a um dicionário Python, com a diferença de que, quando você tenta acessar uma chave que não existe, o defaultdict cria automaticamente a chave e vincula a ela um valor padrão. Isso é especialmente útil para evitar exceções de KeyError ao acessar chaves ausentes.

A principal diferença entre um defaultdict e um dicionário Python comum é a maneira como eles tratam chaves ausentes. Em um dicionário comum, você receberá um KeyError ao tentar acessar uma chave que não existe. Já em um defaultdict, nenhuma exceção KeyError é lançada e um valor padrão é retornado no lugar.

Usando o tipo defaultdict do Python

Agora que você já entende como o defaultdict funciona, vamos ver como usá-lo para diferentes operações com dicionários.

Agrupando itens

Digamos que você tenha uma lista de palavras e queira agrupá-las por sua primeira letra. Você pode usar um defaultdict para criar um dicionário em que cada chave seja a primeira letra de uma palavra e o valor seja uma lista de palavras com essa mesma primeira letra:

from collections import defaultdict
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']
word_groups = defaultdict(list)
for word in words:
first_letter = word[0]
word_groups[first_letter].append(word)
print(dict(word_groups))

A saída será:

{'a': ['apple'], 'b': ['banana'], 'c': ['cherry'], 'd': ['date'], 'e': ['elderberry']}

Agrupando itens exclusivos

Se você quiser agrupar apenas as letras únicas das palavras da lista anterior, pode usar um defaultdict com set como valor padrão:

from collections import defaultdict
words = ['apple', 'banana', 'cherry', 'date', 'elderberry']
unique_letters = defaultdict(set)
for word in words:
for letter in set(word):
unique_letters[letter].add(word)
print(dict(unique_letters))

A saída será:

{'a': {'cherry', 'banana', 'date', 'apple'}, 'l': {'elderberry'}, 'b': {'banana'}, 'n': {'banana'}, 'c': {'cherry'}, 'y': {'cherry'}, 'e': {'elderberry'}}

Contando itens

Suponha que você tenha uma lista de números repetidos e queira contar quantas vezes cada número aparece. Você pode usar um defaultdict com um contador como valor padrão:

from collections import defaultdict
numbers = [1, 2, 3, 4, 1, 2, 3, 1, 2, 1]
number_counts = defaultdict(int)
for number in numbers:
number_counts[number] += 1
print(dict(number_counts))

A saída será:

{1: 4, 2: 3, 3: 2, 4: 1}

Acumulando valores

Se você tiver uma lista de números e quiser acumulá-los com base em sua primeira letra, você pode usar um defaultdict com zero como valor padrão:

from collections import defaultdict
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
letter_sums = defaultdict(int)
for number in numbers:
first_letter = str(number)[0]
letter_sums[first_letter] += number
print(dict(letter_sums))

A saída será:

{'1': 1, '2': 11}

Conclusão

Neste tutorial, você aprendeu como usar o tipo defaultdict do Python para lidar com chaves ausentes em dicionários. Vimos diferentes maneiras de lidar com esse problema e exploramos várias aplicações do defaultdict para operações de agrupamento, contagem e acumulação.

Usar o defaultdict pode melhorar a legibilidade e eficiência do seu código, ao evitar exceções KeyError e fornecer um valor padrão para chaves ausentes.

Agora que você entende como o defaultdict funciona, experimente aplicá-lo em seus próprios projetos!