# Обычный 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