defaultdict
Автоматически инициализируйте значения словаря
«defaultdict» — бесплатный урок Python Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Проблема отсутствующего ключа
В обычном dict обращение к несуществующему ключу вызывает исключение KeyError. Это неудобно, когда нужно постепенно накапливать значения.
d = {}
try:
d['x'].append(1)
except KeyError as e:
print('KeyError:', e)Знакомство со словарём значений по умолчанию
defaultdict из модуля collections принимает функцию-фабрику, которая создаёт значение по умолчанию для любого отсутствующего ключа. Импортируйте его с помощью from collections import defaultdict.
from collections import defaultdict
d = defaultdict(int)
print(d['missing'])
print(dict(d))Подсчёт с помощью целых чисел
В defaultdict(int) для отсутствующих ключей по умолчанию используется 0, поэтому можно увеличивать значение, не проверяя ключ заранее.
from collections import defaultdict
counts = defaultdict(int)
for ch in 'banana':
counts[ch] += 1
print(dict(counts))Группировка с помощью списка
defaultdict(list) создаёт пустой список для новых ключей, что идеально подходит для объединения элементов в группы.
from collections import defaultdict
groups = defaultdict(list)
words = ['apple', 'ant', 'bee', 'bear']
for w in words:
groups[w[0]].append(w)
print(dict(groups))Сбор с помощью множества
Используйте defaultdict(set), если для каждого ключа нужны уникальные значения. Дубликаты удаляются автоматически.
from collections import defaultdict
seen = defaultdict(set)
pairs = [('a', 1), ('a', 1), ('a', 2), ('b', 3)]
for k, v in pairs:
seen[k].add(v)
print(dict(seen))Фабрика должна быть вызываемым объектом
Аргументом должен быть вызываемый объект, который не принимает аргументов и возвращает значение по умолчанию. Подходят int, list, set и dict, потому что их вызов возвращает пустое значение.
from collections import defaultdict
print(int())
print(list())
print(set())Пользовательское значение по умолчанию с lambda
Можно передать любой вызываемый объект без аргументов, например lambda, чтобы возвращать пользовательское значение по умолчанию.
from collections import defaultdict
scores = defaultdict(lambda: 100)
print(scores['new_player'])
scores['alice'] -= 10
print(dict(scores))Вложенные словари значений по умолчанию
Фабрика может сама создавать defaultdict, позволяя строить вложенные структуры без ручной настройки.
from collections import defaultdict
table = defaultdict(lambda: defaultdict(int))
table['fruit']['apples'] += 3
table['fruit']['pears'] += 2
print(table['fruit']['apples'])
print(table['fruit']['pears'])Обращение создаёт ключ
Обратите внимание: простое чтение отсутствующего ключа добавляет его со значением по умолчанию. После обращения ключ существует в словаре.
from collections import defaultdict
d = defaultdict(int)
_ = d['ghost']
print('ghost' in d)
print(dict(d))Проверка без добавления
Чтобы проверить ключ, не создавая его, используйте метод .get() или оператор in — они никогда не запускают фабрику.
from collections import defaultdict
d = defaultdict(int)
print(d.get('safe', 'default'))
print('safe' in d)
print(dict(d))Преобразование обратно в словарь
Оберните defaultdict в dict(), если нужен обычный словарь, например перед возвратом из функции или аккуратным выводом.
from collections import defaultdict
dd = defaultdict(list)
dd['a'].append(1)
plain = dict(dd)
print(type(plain))
print(plain)Быстрая проверка
Что обозначает аргумент, передаваемый в defaultdict?
Повторение: словарь значений по умолчанию
Главное:
defaultdict(factory)автоматически создаёт значения для отсутствующих ключей;intвозвращает 0 (для подсчёта),list— [] (для группировки),set— пустое множество (для группировки уникальных значений);- Фабрикой может быть любой вызываемый объект без аргументов, включая
lambda; - Чтение отсутствующего ключа добавляет его; для безопасной проверки используйте
.get()илиin.
from collections import defaultdict
g = defaultdict(list)
for w in ['cat', 'cow', 'dog']:
g[w[0]].append(w)
print(dict(g))Часто задаваемые вопросы
Урок «defaultdict» бесплатный?
Да — полный текст урока «defaultdict» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «defaultdict»?
Автоматически инициализируйте значения словаря Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «defaultdict»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Counter
- defaultdict
- deque
- namedtuple и OrderedDict