Pular para o conteúdo

Como usar o defaultdict do Python?

[

Utilizando o tipo Python defaultdict para lidar com chaves ausentes

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

O tipo defaultdict em Python se comporta quase exatamente como um dicionário Python regular, mas se você tentar acessar ou modificar uma chave inexistente, 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.

Manipulando chaves ausentes em dicionários

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

  1. Uso da exceção KeyError
  2. Uso do método .get()
  3. Uso do método .setdefault()
  4. Uso do tipo defaultdict

Para evitar capturar exceções, o método .get() é uma maneira segura de acessar chaves em um dicionário, pois ele retorna um valor padrão quando a chave não existe:

my_dict = {"a": 1, "b": 2}
value = my_dict.get("c", "Valor padrão")
print(value) # Saída: Valor padrão

Da mesma forma, o método .setdefault() pode ser usado para obter o valor de uma chave, mas também define um valor padrão para ela se a chave não existir:

my_dict = {"a": 1, "b": 2}
value = my_dict.setdefault("c", "Valor padrão")
print(value) # Saída: Valor padrão
print(my_dict) # Saída: {"a": 1, "b": 2, "c": "Valor padrão"}

No entanto, o uso do tipo defaultdict pode ser mais conveniente em determinadas situações, especialmente quando você precisa lidar com chaves ausentes que requerem a geração de um valor padrão específico.

Entendendo o tipo Python defaultdict

O tipo defaultdict é uma subclasse do tipo dict e fornece a funcionalidade adicional de definir um valor padrão para chaves ausentes. A sintaxe básica para criar um defaultdict é a seguinte:

from collections import defaultdict
my_dict = defaultdict(default_factory)

Observe que default_factory é uma função que é chamada sempre que uma chave ausente é acessada. Essa função deve retornar o valor padrão desejado para a chave ausente.

Usando o tipo Python defaultdict

Agora que entendemos o conceito de defaultdict, vamos ver como usá-lo para operações de agrupamento, contagem e acumulação.

Agrupando itens

Uma tarefa comum ao trabalhar com dados é agrupá-los com base em um determinado critério. Com o tipo defaultdict, você pode agrupar itens de uma lista usando uma chave específica. Considere o seguinte exemplo:

from collections import defaultdict
data = [
("apple", "green"),
("banana", "yellow"),
("apple", "red"),
("banana", "green"),
("cherry", "red"),
]
grouped_data = defaultdict(list)
for fruit, color in data:
grouped_data[fruit].append(color)
print(grouped_data)

Saída:

defaultdict(<class 'list'>, {'apple': ['green', 'red'], 'banana': ['yellow', 'green'], 'cherry': ['red']})

Nesse exemplo, criamos um defaultdict com list como valor padrão. Em seguida, percorremos a lista data e adicionamos as cores correspondentes a cada fruta na lista de cores associada a essa fruta no dicionário grouped_data.

Agrupando itens únicos

Às vezes, você também pode querer agrupar apenas as ocorrências únicas de determinados itens. Para fazer isso, você pode usar o tipo set como valor padrão em um defaultdict. Veja o exemplo a seguir:

from collections import defaultdict
data = [
("apple", "green"),
("banana", "yellow"),
("apple", "red"),
("banana", "green"),
("cherry", "red"),
]
unique_grouped_data = defaultdict(set)
for fruit, color in data:
unique_grouped_data[fruit].add(color)
print(unique_grouped_data)

Saída:

defaultdict(<class 'set'>, {'apple': {'green', 'red'}, 'banana': {'yellow', 'green'}, 'cherry': {'red'}})

Nesse exemplo, estamos usando um defaultdict com set como valor padrão. Assim como antes, percorremos a lista data e adicionamos as cores correspondentes a cada fruta no conjunto de cores associado a essa fruta no dicionário unique_grouped_data. O valor set garante que apenas as cores únicas sejam armazenadas.

Contando itens

Outra tarefa comum é contar a ocorrência de determinados itens em uma lista. Com o tipo defaultdict, você pode contar itens facilmente usando um int como valor padrão. Veja o exemplo a seguir:

from collections import defaultdict
data = ["apple", "banana", "apple", "banana", "cherry", "banana"]
item_count = defaultdict(int)
for item in data:
item_count[item] += 1
print(item_count)

Saída:

defaultdict(<class 'int'>, {'apple': 2, 'banana': 3, 'cherry': 1})

Nesse exemplo, criamos um defaultdict com int como valor padrão. Ao percorrer a lista data, incrementamos o contador para cada item encontrado.

Acumulando valores

Em algumas situações, você pode querer acumular valores correspondentes a uma determinada chave em vez de substituí-los. Para fazer isso, você pode usar uma função lambda como valor padrão em um defaultdict. Veja o exemplo a seguir:

from collections import defaultdict
data = [
("apple", 10),
("banana", 5),
("apple", 7),
("banana", 3),
("cherry", 2),
]
total_fruits = defaultdict(lambda: 0)
for fruit, quantity in data:
total_fruits[fruit] += quantity
print(total_fruits)

Saída:

defaultdict(<function <lambda> at 0x7f3328d90d30>, {'apple': 17, 'banana': 8, 'cherry': 2})

Nesse exemplo, estamos usando uma função lambda como valor padrão em um defaultdict. A função lambda retorna 0 sempre que uma chave ausente é acessada. Em seguida, percorremos a lista data e acumulamos a quantidade de frutas correspondente a cada chave no dicionário total_fruits.

Conclusão

Neste tutorial, você aprendeu como usar o tipo defaultdict em Python para lidar com chaves ausentes em dicionários. Vimos que o defaultdict é uma alternativa conveniente ao dicionário regular do Python quando você precisa lidar com chaves ausentes. Além disso, exploramos diferentes maneiras de usar o defaultdict para agrupar itens, contar itens e acumular valores.

Esse conhecimento permitirá que você utilize o tipo defaultdict de forma eficaz em seus desafios de programação diários. Agora você pode aproveitar ao máximo esse recurso poderoso para melhorar sua produtividade ao lidar com dicionários em Python.