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

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

Создание defaultdict

Создание defaultdict похоже на создание обычного dict. Вы можете передать фабричную функцию по умолчанию конструктору или создать пустой defaultdict и указать фабричную функцию по умолчанию позже.

from collections import defaultdict

# Creating a defaultdict with a default value of 0
dd = defaultdict(int)

# Adding keys and values
dd['a'] = 1
dd['b'] = 2
dd['c'] = 3

# Accessing existing and non-existing keys
print(dd['a'])  # Output: 1
print(dd['d'])  # Output: 0

Это выведет:

1
0

В приведенном выше примере мы создали defaultdict со значением по умолчанию 0. Затем мы добавили к нему три пары ключ-значение и получили доступ к двум ключам, одному существующему и другому несуществующему. Когда мы попытались получить доступ к несуществующему ключу, мы получили значение по умолчанию 0 вместо KeyError.



Заводские функции по умолчанию

Значение по умолчанию для defaultdict задается фабричной функцией, которая передается конструктору. Эта функция вызывается без аргументов и должна возвращать значение по умолчанию для несуществующего ключа. Вы можете использовать несколько встроенных фабричных функций, таких как int, float, list, set и dict.

from collections import defaultdict

# Creating a defaultdict with a default value of an empty list
dd = defaultdict(list)

# Adding values to lists
dd['a'].append(1)
dd['b'].append(2)
dd['c'].append(3)

# Accessing existing and non-existing keys
print(dd['a'])  # Output: [1]
print(dd['d'])  # Output: []

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

Вложенные слова по умолчанию

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

from collections import defaultdict

# Creating a nested defaultdict with a default value of an empty dict
dd = defaultdict(lambda: defaultdict(list))

# Adding values to nested dicts
dd['a']['x'].append(1)
dd['b']['y'].append(2)
dd['c']['z'].append(3)

# Accessing existing and non-existing keys
print(dd['a']['x'])  # Output: [1]
print(dd['d']['w'])  # Output: []

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



Использование фабричной функции defaultdict

В дополнение к встроенным фабричным функциям вы также можете создавать свои собственные фабричные функции, которые возвращают значение по умолчанию по вашему выбору. Например, вы можете создать фабричную функцию, которая возвращает строку «по умолчанию» в качестве значения по умолчанию.

from collections import defaultdict

# Creating a defaultdict with a custom default factory function
def my_default():
    return "default"

dd = defaultdict(my_default)

# Adding values
dd['a'] = 'apple'
dd['b'] = 'banana'

# Accessing existing and non-existing keys
print(dd['a'])  # Output: apple
print(dd['c'])  # Output: default

Это выведет:

apple
default

В приведенном выше примере мы создали пользовательскую фабричную функцию по умолчанию my_default, которая возвращает строку «по умолчанию». Затем мы создали defaultdict с этой фабричной функцией и добавили к ней две пары ключ-значение. Когда мы попытались получить доступ к несуществующему ключу, мы получили значение по умолчанию «по умолчанию».



Учебное пособие по словарю Python: освоение структур данных пары «ключ-значение для эффективного программирования
Словарь Python — это встроенная структура данных, которая позволяет хранить данные и управлять ими в ключе- пары значений. Каждый…soumenatta.medium.com»



Преимущества использования defaultdict

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

if key in my_dict:
    my_dict[key].append(value)
else:
    my_dict[key] = [value]

вы можете просто написать:

my_dict[key].append(value)

Если ключ не существует, он будет автоматически создан со значением по умолчанию, возвращаемым фабричной функцией.

Заключение

В этом руководстве мы узнали, как использовать класс defaultdict в Python для создания словарей со значениями по умолчанию для несуществующих ключей. Мы увидели, как использовать встроенные фабричные функции, а также как создавать собственные фабричные функции. Мы также увидели, как создавать вложенные defaultdicts и преимущества использования defaultdict в нашем коде. Обладая этими знаниями, вы сможете писать более чистый, лаконичный и эффективный код, использующий словари в Python.