# Обычный Python Dict VS collections.defaultdict
Обычный старый словарь Python
Вот обычный старый словарь Python.
d = {'apple':4, 'orange':5}
Если мы попытаемся получить доступ к несуществующему ключу, например. 'pear'
, мы получаем KeyError.
print(d['pear']) # KeyError
Представляем defaultdict
Сначала нам нужно импортировать модуль collections
. Обратите внимание, что это встроенная программа и ничего устанавливать не нужно.
import collections def default_value_function(): return 100 dd = collections.defaultdict(default_value_function)
default_value_function
— это функция, которая ничего не принимает и возвращает значение (значение по умолчанию, которое мы хотим, чтобы наш defaultdict возвращал)dd
— это наш объект defaultdict — он принимаетdefault_value_function
в момент инициализации.
Наш defaultdict ведет себя так же, как и наш словарь — мы передаем ключ и возвращаем значение, связанное с ключом (за время O(1)). Но есть одно главное отличие.
print(dd['pineapple']) # 100
Здесь ключ 'pineapple'
не существует. Однако мы не получаем KeyError, когда пытаемся получить доступ к ключу 'pineapple'
— вместо этого значение по умолчанию 100
, которое мы определяем в момент инициализации
Инициализация defaultdict со значениями
import collections def default_value_function(): return 100 dd = collections.defaultdict(default_value_function, {'apple':4, 'orange':5}) # equivalent to {'apple':4, 'orange':5}
Чтобы вставить значения в словарь по умолчанию в момент инициализации, мы можем просто добавить еще один аргумент (словарь) позади.
print(dd['apple']) # 4 print(dd['orange']) # 5 print(dd['pear']) # 100
Наш defaultdict теперь будет иметь 2 пары ключ-значение в момент инициализации и будет возвращать соответствующие значения, если мы получим доступ к ключам. Примечание. Если мы попытаемся получить доступ к несуществующему ключу, он просто вернет значение по умолчанию.
Обычно запутанный пример
import collections dd = collections.defaultdict(int, {'apple':4, 'orange':5})
Возможно, вы видели что-то подобное — default_value_function
заменяется на int
(или float
, str
и т. д.). Перво-наперво — базовое поведение не меняется.
import collections dd = collections.defaultdict(int, {'apple':4, 'orange':5}) print(dd['pear']) # returns int() # int() happens to be 0 # 0 is thus returned import collections dd = collections.defaultdict(float, {'apple':4, 'orange':5}) print(dd['pear']) # returns float() # float() happens to be 0.0 # 0.0 is thus returned import collections dd = collections.defaultdict(str, {'apple':'pie', 'orange':'juice'}) print(dd['pear']) # returns str() # str() happens to be '' # '' is thus returned
Пока мы понимаем, что происходит, когда мы называем такие вещи, как int()
float()
и str()
, становится более интуитивно понятно, что происходит в коде.
Заключение
Надеюсь, вы сегодня узнали что-то новое!
Несколько заключительных слов
Если эта история была полезной и вы хотите оказать небольшую поддержку, вы можете:
- Похлопайте 50 раз за эту историю (мне это очень-очень помогает)
- Подпишитесь на членство в Medium, используя мою ссылку (5 долларов в месяц, чтобы читать неограниченное количество историй на Medium)
Настройка моего домашнего офиса: https://zlliu.co/workspace
Мои бесплатные электронные книги: https://zlliu.co/books