Как и когда следует использовать Defaultdict в Python?
Опубликовано: 2022-10-06В этом руководстве вы узнаете, как использовать defaultdict из модуля коллекций Python, чтобы лучше обрабатывать KeyErrors, при работе со словарями Python.
В Python словарь — это мощная встроенная структура данных, которая хранит данные в парах ключ-значение. Вы будете использовать клавиши для входа в словарь и доступа к значениям.
Однако если в вашем скрипте Python есть несколько словарей, которые изменяются во время выполнения кода, вы часто будете сталкиваться с ошибками KeyError. И есть несколько разных способов справиться с ними.
В этом уроке вы узнаете:
- Что такое KeyErrors и почему они возникают
- Как обрабатывать KeyErrors
- Как использовать Python defaultdict, подкласс, который наследуется от встроенного класса dict, для лучшей обработки отсутствующих ключей
Давайте начнем!
Что такое KeyErrors в Python?

При определении словаря Python вы должны позаботиться о том, чтобы убедиться в следующем:
- Ключи должны быть уникальными — без повторений.
- При использовании существующего итерируемого объекта в качестве ключей словаря лучше использовать неизменяемую коллекцию, такую как кортеж.
Таким образом, ключ действителен только в том случае, если он присутствует в словаре; иначе это приводит к KeyErrors.
Рассмотрим следующий словарь, books_authors
, в котором ключами являются названия книг, а значениями являются имена авторов.
Вы можете кодировать вместе с этим руководством в Python REPL.
books_authors = { 'Deep Work':'Cal Newport', 'Hyperfocus':'Chris Bailey', 'Pivot':'Jenny Blake', 'The Happiness Equation':'Neil Pasricha' }
Вы можете использовать ключ (название книги) для доступа к имени автора.
books_authors['Hyperfocus'] 'Chris Bailey'
Чтобы получить доступ ко всем парам ключ-значение в словаре, вы можете вызвать метод items()
для объекта словаря, как показано ниже:
for book,author in books_authors.items(): print(f"'{book}' by {author}")
'Deep Work' by Cal Newport 'Hyperfocus' by Chris Bailey 'Pivot' by Jenny Blake 'The Happiness Equation' by Neil Pasricha
Если вы попытаетесь получить доступ к значению ключа, которого нет в словаре, интерпретатор Python выдаст ошибку KeyError. Мы сталкиваемся с KeyError, когда пытаемся получить доступ к значению несуществующих ключей, а именно «Grit» и «несуществующий ключ».
books_authors['Grit']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-6-e1a4486f5ced> in <module> ----> 1 books_authors['Grit'] KeyError: 'Grit'
books_authors['non-existent-key']
--------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-7-a3efd56f69e5> in <module> ----> 1 books_authors['non-existent-key'] KeyError: 'non-existent-key'
Итак, как вы справляетесь с KeyErrors в Python?
Есть несколько способов сделать это, и мы изучим их в следующем разделе.
Как обрабатывать KeyErrors в Python

Давайте узнаем, как обрабатывать KeyErrors, используя:
- Условные операторы if-else
- блоки try-кроме
- Метод словаря
.get()
№1. Использование условных операторов if-else
Один из самых простых способов обработки KeyErrors в Python — использование условных операторов if-else.
В Python операторы if-else имеют следующий общий синтаксис:
if condition: # do this else: # do something else
- Если условие
True
, операторы в телеif
выполняются, и - Если условие равно
False
, выполняются операторы в телеelse
.
В этом примере условием является проверка наличия ключа в словаре.
Если ключ присутствует в словаре, оператор in
вернет True
, и если тело будет выполнено, будет выведено соответствующее значение.
key = 'The Happiness Equation' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Neil Pasricha
Если ключ отсутствует в словаре, оператор in
возвращает значение False
и выполняется тело else
. Выдает сообщение о том, что ключ отсутствует.
key = 'non-existent-key' if key in books_authors: print(books_authors[key]) else: print('Sorry, this key does not exist!') # Output # Sorry, this key does not exist!
№ 2. Использование операторов Try-Except

Другой распространенный метод обработки KeyError — использование операторов try-except в Python.
Прочитайте следующий блок кода:
key = 'non-existent-key' try: print(books_authors[key]) except KeyError: print('Sorry, this key does not exist!')
- Блок try пытается получить значение, соответствующее предоставленному ключу.
- Если ключ отсутствует, интерпретатор вызывает ошибку KeyError, которая обрабатывается как исключение в блоке исключения .
№3. Использование метода .get()
В Python вы можете использовать встроенный метод словаря .get() для обработки отсутствующих ключей.
Общий синтаксис для использования метода
get()
:dict.get(key,default_value)
гдеdict
— допустимый объект словаря в Python.– Если ключ присутствует в словаре, то метод
get()
возвращает значение.
– В противном случае возвращается значение по умолчанию.
В этом примере keys
— это список ключей, к значениям которых мы хотели бы получить доступ. Мы перебираем список ключей, чтобы получить соответствующие значения из словаря books_authors
.
Здесь мы использовали метод .get() со значением по умолчанию «Не существует».
keys = ['Grit','Hyperfocus','Make Time','Deep Work'] for key in keys: print(books_authors.get(key,'Does not exist'))
В приведенном выше коде:

- Для ключей, присутствующих в словаре
books_authors
, метод.get()
возвращает соответствующие значения. - Когда ключи не существуют, в данном случае «Выдержка» и «Выработка времени», метод .get() возвращает значение по умолчанию «Не существует».
# Output Does not exist Chris Bailey Does not exist Cal Newport
Все вышеперечисленные методы помогают нам в обработке ключевых ошибок. Однако они многословны и требуют, чтобы мы явно обрабатывали отсутствующие ключи. Вы можете упростить этот процесс, используя defaultdict вместо обычного словаря.
Defaultdict в Python

defaultdict является подклассом класса словаря ( dict
). Таким образом, он наследует поведение словаря Python. Кроме того, он также изначально обрабатывает отсутствующие ключи.
defaultdict — это контейнерный тип данных, встроенный в стандартную библиотеку Python — внутри модуля collections
.
Итак, вы должны импортировать его в свою рабочую среду:
from collections import defaultdict
Вот общий синтаксис для использования defaultdict
:
defaultdict(default_factory)
Вы можете указать вызываемый объект, такой как int, float или list, в качестве атрибута default_factory
. Если вы не укажете значение для default_factory
, по умолчанию оно равно None
.
Когда ключ, который вы ищете, отсутствует, запускается метод __missing__()
, который выводит значение по умолчанию из default_factory
. Затем он возвращает это значение по умолчанию.
В итоге:
- В Python
defaultdict
возвращает значение по умолчанию, когда ключ отсутствует. - Он также добавляет эту пару ключ-значение по умолчанию в словарь, который затем можно изменить.
Примеры Python Defaultdict

Далее мы напишем несколько примеров, чтобы понять, как работает Python defaultdict.
Defaultdict в Python с целочисленным значением по умолчанию
Сначала импортируйте defaultdict
из модуля collections
.
from collections import defaultdict import random
Давайте создадим prices
по умолчанию.
prices = defaultdict(int)
Теперь мы заполняем словарь prices
, используя элементы списка fruits
в качестве ключей. И мы случайным образом выбираем значения из price_list
-листа, чтобы получить значения.
price_list = [10,23,12,19,5] fruits = ['apple','strawberry','pomegranate','blueberry'] for fruit in fruits: prices[fruit] = random.choice(price_list)
Давайте посмотрим на пары ключ-значение в defaultdict prices
.
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])
Как и в обычном словаре Python, вы можете получить доступ к значениям defaultdict prices
с помощью ключей:
prices['apple'] # 23
Теперь давайте попробуем получить доступ к цене фрукта, которого нет, скажем, «апельсина». Мы видим, что он возвращает значение по умолчанию , равное нулю.
prices['orange'] # 0
Если мы распечатаем словарь, мы увидим, что был добавлен новый ключ «оранжевый» с целочисленным значением по умолчанию, равным нулю.
print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10), ('orange', 0)])
Defaultdict в Python со списком в качестве значения по умолчанию
Давайте определим students_majors
как список списков по defaultdict
. Имена майоров являются ключами. А значения — это списки студентов, изучающих каждую из специальностей, таких как математика, экономика, информатика и другие.
from collections import defaultdict students_majors = defaultdict(list)
Если мы попытаемся получить доступ к списку студентов, соответствующему «Экономике», defaultdict вернет пустой список; никаких ключевых ошибок!
students_majors['Economics'] # []
Теперь у нас есть пустой список, привязанный к специальности «Экономика». Итак, теперь мы можем добавлять элементы в этот список, используя метод списка .append()
.
students_majors['Economics'].append('Alex')
Запись была создана для «Экономики» в словаре по умолчанию students_majors
.
print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex']})
Вы можете добавить больше студентов в список, сопоставленный с специализацией «Экономика», добавить новую специализацию и многое другое!
students_majors['Economics'].append('Bob') students_majors['Math'].append('Laura') print(students_majors)
defaultdict(<class 'list'>, {'Economics': ['Alex', 'Bob'], 'Math': ['Laura']})
Вывод
Я надеюсь, что это руководство помогло вам понять, как и когда следует использовать defaultdict в Python. После запуска примеров кода в этом руководстве вы можете попробовать использовать defaultdict в качестве предпочтительной структуры данных в своих проектах, когда это необходимо.
Вот краткое изложение того, что вы узнали в этом уроке.
- При работе со словарем Python вы часто будете сталкиваться с KeyErrors.
- Для обработки таких ошибок KeyError вы можете использовать несколько подробных методов. Вы можете использовать условные операторы, блоки try-except или метод .get(). Но тип данных defaultdict в модуле collections может упростить эту обработку KeyError.
- Вы можете использовать defaultdict(default_factory) , где default_factory является допустимым вызываемым.
- Когда ключ отсутствует в defaultdict, значение по умолчанию (выведенное из default_factory ) и ключ добавляются в defaultdict.
Затем ознакомьтесь с учебным пособием по функции карты Python.