Как и когда следует использовать Defaultdict в Python?

Опубликовано: 2022-10-06

В этом руководстве вы узнаете, как использовать defaultdict из модуля коллекций Python, чтобы лучше обрабатывать KeyErrors, при работе со словарями Python.

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

Однако если в вашем скрипте Python есть несколько словарей, которые изменяются во время выполнения кода, вы часто будете сталкиваться с ошибками KeyError. И есть несколько разных способов справиться с ними.

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

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

Давайте начнем!

Что такое KeyErrors в Python?

1

При определении словаря 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

Как обрабатывать ключевые ошибки в 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

2

Другой распространенный метод обработки 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

python-defaultdict

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

Defaultdict-Примеры-1

Далее мы напишем несколько примеров, чтобы понять, как работает 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.