Пояснена структура даних словника Python

Словник - одна з найбільш часто використовуваних структур даних у Python. Словник - це впорядкована колекція предметів, і ми, як правило, зберігаємо ключі та значення в словнику. Давайте розглянемо кілька прикладів того, як зазвичай використовують словник.

# dictionary declaration 1 dict1 = dict() # dictionary declaration 2 dict2 = {} # Add items to the dictionary # The syntax to add and retrieve items is same for either of the two objects we defined above. key = "X" value = "Y" dict1[key] = value # The dictionary doesn't have any specific data-type. # So, the values can be pretty diverse. dict1[key] = dict2

Давайте тепер розглянемо деякі способи пошуку.

# Since "X" exists in our dictionary, this will retrieve the value value = dict1[key] # This key doesn't exist in the dictionary. # So, we will get a `KeyError` value = dict1["random"]

Уникнення помилки KeyError: використовуйте функцію .get

У випадку, якщо вказаний ключ не існує у словнику, Python видасть a KeyError. Для цього існує просте обхідне рішення. Давайте розглянемо, як нам уникнути KeyErrorвикористання вбудованої .getфункції для словників.

dict_ = {} # Some random key random_key = "random" # The most basic way of doing this is to check if the key # exists in the dictionary or not and only retrieve if the # key exists. Otherwise not. if random_key in dict_: print(dict_[random_key]) else: print("Key = {} doesn't exist in the dictionary".format(dict_))

Багато разів ми в порядку отримуємо значення за замовчуванням, коли ключ не існує. Наприклад, наприклад, при побудові лічильника. Існує кращий спосіб отримати значення за замовчуванням зі словника на випадок відсутності ключів, а не покладатися на стандартні if-else.

# Let's say we want to build a frequency counter for items in the following array arr = [1,2,3,1,2,3,4,1,2,1,4,1,2,3,1] freq = {} for item in arr: # Fetch a value of 0 in case the key doesn't exist. Otherwise, fetch the stored value freq[item] = freq.get(item, 0) + 1

Отже, get(, )це зручна операція для отримання значення за замовчуванням для будь-якого даного ключа зі словника. Проблема з цим методом виникає, коли ми хочемо мати справу зі змінними структурами даних як значеннями, наприклад listабо set.

dict_ = {} # Some random key random_key = "random" dict_[random_key] = dict_.get(random_key, []).append("Hello World!") print(dict_) # {'random': None} dict_ = {} dict_[random_key] = dict_.get(random_key, set()).add("Hello World!") print(dict_) # {'random': None}

Ви бачили проблему?

Нове setабо listне призначається ключу словника. Ми повинні призначити ключу нове listабо a setу випадку відсутності значення, а потім appendабо addвідповідно. Погляд Лей на приклад для цього.

dict_ = {} dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!") print(dict_) # {'random': set(['Hello World!'])}. Yay!

Уникнення помилки KeyError: використовуйте вирок за замовчуванням

Це працює більшість випадків. Однак є кращий спосіб зробити це. Більше pythonic. Це defaultdictпідклас вбудованого класу dict. defaultdictПросто привласнює значення за замовчуванням, зазначені нами в разі відсутності ключа. Отже, два кроки:

dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!")

тепер можна об’єднати в один крок. Наприклад,

from collections import defaultdict # Yet another random key random_key = "random_key" # list defaultdict list_dict_ = defaultdict(list) # set defaultdict set_dict_ = defaultdict(set) # integer defaultdict int_dict_ = defaultdict(int) list_dict_[random_key].append("Hello World!") set_dict_[random_key].add("Hello World!") int_dict_[random_key] += 1 """ defaultdict(, {'random_key': ['Hello World!']}) defaultdict(, {'random_key': {'Hello World!'}}) defaultdict(, {'random_key': 1}) """ print(list_dict_, set_dict_, int_dict_)

Офіційні документи