Як і коли слід використовувати Defaultdict у Python?

У цьому підручнику ви дізнаєтеся, як використовувати defaultdict із модуля колекцій Python — щоб краще обробляти KeyErrors — під час роботи зі словниками Python.

У Python словник — це потужна вбудована структура даних, яка зберігає дані в парах ключ-значення. Ви будете використовувати клавіші, щоб торкнутися словника та отримати доступ до значень.

Однак якщо у вашому сценарії Python є кілька словників, які змінюються під час виконання коду, ви часто стикаєтеся з KeyErrors. І є кілька різних способів їх вирішення.

У цьому посібнику ви дізнаєтесь:

  • Що таке 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» і «non-existent key».

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?

  5 способів виправити Sims 4 Не вдається запустити вміст ваших даних користувача

Є кілька способів зробити це, і ми дізнаємося про них у наступному розділі.

Як обробляти KeyErrors у Python

Давайте дізнаємося, як обробляти KeyErrors за допомогою:

  • Умовні оператори if-else
  • Блоки Try-except
  • Метод словника .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, а if body буде виконано, виводячи відповідне значення.

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() повертає значення.
– Інакше повертає значення за замовчуванням.

У цьому прикладі ключі — це список ключів, до значень яких ми хочемо отримати доступ. Ми переглядаємо список ключів, щоб отримати відповідні значення зі словника 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() повертає відповідні значення.
  • Коли ключі не існують, у цьому випадку «Grit» і «Make Time», метод .get() повертає значення за замовчуванням «Does not exist».
# Output

Does not exist
Chris Bailey
Does not exist
Cal Newport

Усі наведені вище методи допомагають нам у вирішенні ключових помилок. Однак вони є багатослівними та вимагають від нас явної обробки відсутніх ключів. Ви можете спростити цей процес, використовуючи defaultdict замість звичайного словника.

Defaultdict у Python

defaultdict є підкласом класу словника (dict). Таким чином, він успадковує поведінку словника Python. Крім того, він також обробляє відсутні ключі нативно.

defaultdict — це контейнерний тип даних, вбудований у стандартну бібліотеку Python — усередині модуля колекцій.

Тож вам потрібно імпортувати його у своє робоче середовище:

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 із модуля колекцій.

from collections import defaultdict
import random

Давайте створимо ціни за замовчуванням.

prices = defaultdict(int)

Тепер ми заповнюємо словник цін, використовуючи елементи списку фруктів як ключі. І ми випадково вибираємо значення з 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.

print(prices.items())
dict_items([('apple', 12), ('blueberry', 19), ('pomegranate', 5), ('strawberry', 10)])

Подібно до звичайного словника Python, ви можете отримати доступ до значень price defaultdict за допомогою клавіш:

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 як стандартний диктор списків. Назви спеціальностей – ключі. А цінності — це списки студентів, які вивчають кожну зі спеціальностей, як-от математика, економіка, інформатика тощо.

from collections import defaultdict
students_majors = defaultdict(list)

Якщо ми спробуємо отримати доступ до списку студентів, що відповідає «Економіці», defaultdict повертає порожній список; немає ключових помилок!

students_majors['Economics']
# []

Тепер у нас є порожній список, пов’язаний із спеціальністю «Економіка». Тепер ми можемо додавати елементи до цього списку за допомогою методу списку .append().

students_majors['Economics'].append('Alex')

У словнику students_majors за замовчуванням створено запис для «Economics».

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 як бажану структуру даних у своїх проектах, коли це необхідно.

  7 найкращих інструментів аналізу продуктивності бази даних

Ось підсумок того, що ви дізналися в цьому посібнику.

  • Працюючи зі словником Python, ви часто стикаєтеся з KeyErrors.
  • Для обробки таких KeyErrors ви можете використовувати кілька докладних методів. Ви можете використовувати умовні оператори, блоки try-except або метод .get(). Але тип даних defaultdict у модулі колекцій може спростити цю обробку KeyError.
  • Ви можете використовувати defaultdict(default_factory), де default_factory є дійсним викликом.
  • Якщо ключ відсутній у defaultdict, значення за замовчуванням (виведене з default_factory) і ключ додається до defaultdict.

Далі перегляньте навчальний посібник із функції карти Python.