Пропустить до содержимого

Как использовать Python dict defaultdict?

CodeMDD.io

Использование типа данных Python defaultdict для работы с отсутствующими ключами

by Леоданис Позо Рамос основы структуры данных python

Использование типа данных Python defaultdict для работы с отсутствующими ключами

Часто возникает проблема, когда при работе с словарями Python вы пытаетесь получить доступ к ключам, которых нет в словаре. Это приводит к возникновению исключения KeyError и прерыванию выполнения кода. Для обработки подобных ситуаций стандартная библиотека предоставляет тип данных Python defaultdict, похожий на обычный словарь, но автоматически создающий отсутствующие ключи и генерирующий для них значения по умолчанию. Это делает defaultdict полезным инструментом для работы с отсутствующими ключами в словарях.

В этом руководстве вы узнаете:

  • Как использовать тип данных Python defaultdict для работы с отсутствующими ключами в словаре.
  • Когда и почему следует использовать defaultdict вместо обычного словаря.
  • Как использовать defaultdict для группировки, подсчета и накопления значений.

С данной информацией вы сможете более эффективно использовать тип данных Python defaultdict при разработке программного обеспечения на ежедневной основе.

Для более эффективного использования данного руководства рекомендуется иметь предварительное понимание словарей Python и основ работы с ними. Если вам нужно освежить память или вы не знакомы с этой темой, ознакомьтесь со следующими ресурсами:

Бесплатный бонус: Нажмите здесь, чтобы получить шпаргалку по Python и изучить основы Python 3, такие как работа с типами данных, словарями, списками и функциями Python.

Обработка отсутствующих ключей в словарях

Часто возникает проблема, когда работа с словарями Python требует обработки отсутствующих ключей. Если ваш код тесно связан со словарями или если вы постоянно создаете словари на лету, вы скоро заметите, что работа с частыми исключениями KeyError может быть довольно раздражающей и добавлять дополнительную сложность в ваш код. В Python у вас есть несколько способов обработки пропущенных ключей:

  1. Использование метода get() словаря: Метод get() позволяет получить значение по ключу, но в случае отсутствия значения возвращает None или указанное значение по умолчанию.
>>> d = {"a": 1, "b": 2}
>>> print(d.get("c", 0))
0
  1. Использование условных операторов: Вы можете использовать условные операторы для проверки наличия ключа в словаре и выполнения соответствующих действий в случае его отсутствия.
>>> d = {"a": 1, "b": 2}
>>> if "c" in d:
... print(d["c"])
... else:
... print(0)
0
  1. Использование метода setdefault(): Метод setdefault() позволяет получить значение по ключу и, если ключ отсутствует, добавить его в словарь с указанным значением по умолчанию.
>>> d = {"a": 1, "b": 2}
>>> print(d.setdefault("c", 0))
0
>>> print(d)
{"a": 1, "b": 2, "c": 0}
  1. Использование конструкции try-except: Вы можете использовать конструкцию try-except для обработки исключения KeyError, вызываемого при попытке доступа к отсутствующему ключу.
>>> d = {"a": 1, "b": 2}
>>> try:
... print(d["c"])
... except KeyError:
... print(0)
0

Несмотря на эти способы, каждый из них имеет свои ограничения и не всегда удобен в использовании. В таких случаях вам может пригодиться тип данных defaultdict.

Понимание типа данных Python defaultdict

Тип данных Python defaultdict является подклассом обычного словаря и наследует все его методы и функциональность. Однако, в отличие от обычного словаря, defaultdict автоматически создает отсутствующие ключи и присваивает им значения по умолчанию при обращении к ним.

Для работы с defaultdict необходимо импортировать модуль collections. В модуле collections также находится стандартный класс словаря.

from collections import defaultdict

Конструктор defaultdict принимает функцию, которая будет вызываться при обращении к отсутствующему ключу. Эта функция называется фабрикой значений по умолчанию и должна возвращать значение по умолчанию для отсутствующего ключа.

defaultdict(default_factory)

Использование типа данных Python defaultdict

Теперь давайте рассмотрим, как использовать тип данных Python defaultdict. В этом разделе приведены примеры группировки элементов, группировки уникальных элементов, подсчета элементов и накопления значений при помощи defaultdict.

Группировка элементов

defaultdict может использоваться для группировки элементов в словаре. В следующем примере список имен группируется по первой букве имени.

from collections import defaultdict
names = ["Alice", "Bob", "Charlie", "Amy", "David"]
grouped_names = defaultdict(list)
for name in names:
grouped_names[name[0]].append(name)
print(dict(grouped_names))

Вывод:

{'A': ['Alice', 'Amy'], 'B': ['Bob'], 'C': ['Charlie'], 'D': ['David']}

Группировка уникальных элементов

defaultdict также может использоваться для группировки уникальных элементов в словаре. В следующем примере из списка имен удаляются дубликаты и имена сгруппированы по первой букве.

from collections import defaultdict
names = ["Alice", "Bob", "Charlie", "Amy", "David", "Alice"]
grouped_names = defaultdict(set)
for name in names:
grouped_names[name[0]].add(name)
print(dict(grouped_names))

Вывод:

{'A': {'Alice', 'Amy'}, 'B': {'Bob'}, 'C': {'Charlie'}, 'D': {'David'}}

Подсчет элементов

defaultdict также может использоваться для подсчета элементов в словаре. В следующем примере список букв подсчитывается с использованием defaultdict.

from collections import defaultdict
letters = ["a", "b", "c", "a", "b", "c", "a"]
letter_counts = defaultdict(int)
for letter in letters:
letter_counts[letter] += 1
print(dict(letter_counts))

Вывод:

{'a': 3, 'b': 2, 'c': 2}

Накопление значений

defaultdict может быть использован для накопления значений в словаре. В следующем примере список чисел накапливается с использованием defaultdict.

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

Вывод:

{'sum': 15}

Углубленное изучение defaultdict

В этом разделе мы рассмотрим несколько аспектов использования defaultdict, таких как сравнение с обычным словарем, атрибут default_factory, отличия от метода setdefault() и метод __missing__().

defaultdict против dict

Основное отличие между defaultdict и обычным словарем заключается в поведении при обращении к отсутствующим ключам. В обычном словаре обращение к отсутствующему ключу вызывает исключение KeyError, в то время как defaultdict автоматически создает отсутствующие ключи и присваивает им значения по умолчанию.

defaultdict.default_factory

У defaultdict есть атрибут default_factory, который определяет функцию по умолчанию для создания значений отсутствующих ключей. Если атрибут default_factory не задан, то значениями по умолчанию для отсутствующих ключей являются None.

from collections import defaultdict
d = defaultdict(list)
print(d.default_factory) # <class 'list'>
d.default_factory = int
print(d.default_factory) # <class 'int'>

defaultdict против dict.setdefault()

Метод setdefault() обычного словаря позволяет получить значение по ключу и, если ключ отсутствует, добавить его в словарь с указанным значением по умолчанию. Но при использовании setdefault() в коде может создаться дополнительное значение по умолчанию для каждого отсутствующего ключа. В то время как defaultdict использует атрибут default_factory для указания значения по умолчанию для всех отсутствующих ключей.

from collections import defaultdict
d = {"a": 1, "b": 2}
print(d.setdefault("c", 0)) # 0
print(d) # {'a': 1, 'b': 2, 'c': 0}
default_d = defaultdict(int)
print(default_d["c"]) # 0
print(dict(default_d)) # {}

defaultdict.missing()

defaultdict также имеет метод __missing__(), который вызывается при попытке доступа к отсутствующему ключу в словаре. Если метод __missing__() определен, то он будет использоваться для обработки исключения KeyError вместо выбрасывания этого исключения.

Эмуляция типа данных Python defaultdict

Если вам необходимо эмулировать тип данных defaultdict или создать кастомный defaultdict, вы можете использовать класс и переопределить метод __missing__(), который будет вызываться при попытке доступа к отсутствующему ключу в словаре.

class CustomDefaultDict(dict):
def __missing__(self, key):
return []

Передача аргументов в .default_factory

Аргументы могут быть переданы в функцию, используемую в качестве default_factory для defaultdict. Ниже приведены примеры использования функции lambda и функции functools.partial(), которые позволяют передавать дополнительные аргументы.

Использование lambda

Функция lambda позволяет определить анонимную функцию, которая может принимать аргументы. Вы можете использовать lambda в качестве default_factory для defaultdict и передавать аргументы непосредственно при создании объекта класса defaultdict.

from collections import defaultdict
d = defaultdict(lambda: "empty")
print(d["a"]) # empty

Использование functools.partial()

Функция functools.partial() позволяет частично применять аргументы к функции. Вы можете передать функцию, которую хотите использовать в качестве default_factory, и задать ее аргументы при помощи functools.partial().

from collections import defaultdict
from functools import partial
def default_factory(default_value):
return default_value
d = defaultdict(partial(default_factory, default_value="empty"))
print(d["a"]) # empty

Заключение

В этом руководстве вы изучили, как использовать тип данных Python defaultdict для работы с отсутствующими ключами в словарях. Вы узнали, как использовать defaultdict для группировки, подсчета и накопления значений. Также было рассмотрено углубленное использование defaultdict, включая сравнение с обычным словарем, атрибут default_factory, отличия от метода setdefault() и метод __missing__(). Вы также узнали, как эмулировать defaultdict и передавать аргументы в .default_factory.

Теперь у вас есть все необходимые знания, чтобы эффективно использовать тип данных Python defaultdict для работы с отсутствующими ключами в ваших программных задачах.