У цьому підручнику ви дізнаєтеся, як використовувати 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?
Є кілька способів зробити це, і ми дізнаємося про них у наступному розділі.
Як обробляти 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 як бажану структуру даних у своїх проектах, коли це необхідно.
Ось підсумок того, що ви дізналися в цьому посібнику.
- Працюючи зі словником Python, ви часто стикаєтеся з KeyErrors.
- Для обробки таких KeyErrors ви можете використовувати кілька докладних методів. Ви можете використовувати умовні оператори, блоки try-except або метод .get(). Але тип даних defaultdict у модулі колекцій може спростити цю обробку KeyError.
- Ви можете використовувати defaultdict(default_factory), де default_factory є дійсним викликом.
- Якщо ключ відсутній у defaultdict, значення за замовчуванням (виведене з default_factory) і ключ додається до defaultdict.
Далі перегляньте навчальний посібник із функції карти Python.