# Обычный 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(), становится более интуитивно понятно, что происходит в коде.

Заключение

Надеюсь, вы сегодня узнали что-то новое!

Несколько заключительных слов

Если эта история была полезной и вы хотите оказать небольшую поддержку, вы можете:

  1. Похлопайте 50 раз за эту историю (мне это очень-очень помогает)
  2. Подпишитесь на членство в Medium, используя мою ссылку (5 долларов в месяц, чтобы читать неограниченное количество историй на Medium)

Настройка моего домашнего офиса: https://zlliu.co/workspace

Мои бесплатные электронные книги: https://zlliu.co/books