Методы словаря dict в Python с примерами
Встроенные методы словаря Python позволяют безопасно читать значения, добавлять и объединять данные, удалять ключи и создавать копии. Ниже собрана сводная таблица всех одиннадцати методов dict, а затем каждый разобран на коротком примере с результатом и типичными ловушками.

Содержание статьи
Сводная таблица методов dict
У словаря одиннадцать обычных методов. Таблица помогает быстро найти нужный по задаче, подробности о каждом ниже.
| Метод | Что делает | Что возвращает |
|---|---|---|
get(key, default=None) | Читает значение без ошибки при отсутствии ключа | Значение или default |
keys() | Дает все ключи | Представление dict_keys |
values() | Дает все значения | Представление dict_values |
items() | Дает пары ключ-значение | Представление dict_items |
update(other) | Добавляет и перезаписывает пары из другого словаря | None |
setdefault(key, default=None) | Добавляет ключ, только если его нет | Текущее значение ключа |
pop(key[, default]) | Удаляет ключ | Удаленное значение |
popitem() | Удаляет последнюю добавленную пару | Кортеж (key, value) |
clear() | Удаляет все элементы | None |
copy() | Создает поверхностную копию | Новый словарь |
dict.fromkeys(keys, value=None) | Создает словарь из набора ключей | Новый словарь |
Полный список с описанием сигнатур можно получить прямо в консоли: help(dict). Сами словари, их создание и ограничения на ключи разобраны в статье о словарях в Python.
Чтение данных: get, keys, values, items
Обращение d[key] к отсутствующему ключу вызывает KeyError. Метод get() в такой ситуации возвращает None или значение, переданное вторым аргументом.
user = {'name': 'Анна', 'age': 27}
print(user.get('name')) # Анна
print(user.get('city')) # None
print(user.get('city', 'Москва')) # Москва
print(user) # {'name': 'Анна', 'age': 27}Обратите внимание: get() ничего не добавляет в словарь, значение по умолчанию только возвращается.
Методы keys(), values() и items() возвращают не списки, а представления. Они не копируют данные и сразу отражают изменения словаря.
stock = {'яблоки': 12, 'груши': 5}
keys = stock.keys()
stock['сливы'] = 8
print(keys) # dict_keys(['яблоки', 'груши', 'сливы'])
print(sum(stock.values())) # 25
for fruit, qty in stock.items():
print(f"{fruit}: {qty}")
# яблоки: 12
# груши: 5
# сливы: 8Представления ключей и пар поддерживают операции множеств: a.keys() & b.keys() вернет общие ключи двух словарей. Если нужен именно список, оберните результат в list(). Индексации у представлений нет, stock.keys()[0] вызовет TypeError.
Добавление и изменение: update и setdefault
Метод update() принимает другой словарь, итерируемый набор пар или именованные аргументы. Существующие ключи перезаписываются, новые добавляются. Метод меняет словарь на месте и возвращает None.
settings = {'theme': 'light', 'lang': 'ru'}
settings.update({'theme': 'dark', 'font': 14})
settings.update(lang='en')
print(settings) # {'theme': 'dark', 'lang': 'en', 'font': 14}
defaults = {'theme': 'light', 'size': 'M'}
merged = defaults | {'size': 'L'} # Python 3.9+
print(merged) # {'theme': 'light', 'size': 'L'}Оператор | работает как update(), но создает новый словарь и не трогает исходные. Вариант |= обновляет словарь на месте.
Метод setdefault() полезен, когда значение нужно и прочитать, и при отсутствии создать. Если ключ есть, он возвращает текущее значение и ничего не меняет. Если ключа нет, добавляет его с указанным значением.
words = ['кот', 'кит', 'дом', 'дуб', 'код']
groups = {}
for w in words:
groups.setdefault(w[0], []).append(w)
print(groups) # {'к': ['кот', 'кит', 'код'], 'д': ['дом', 'дуб']}Без setdefault() пришлось бы писать проверку if w[0] not in groups на каждом шаге. Для той же задачи в модуле collections есть класс defaultdict, который создает значение по умолчанию автоматически.
Удаление: pop, popitem и clear
Метод pop() удаляет ключ и возвращает его значение. Без второго аргумента отсутствующий ключ вызывает KeyError, с ним ошибки не будет.
cart = {'хлеб': 50, 'молоко': 90, 'сыр': 400}
price = cart.pop('сыр')
print(price, cart) # 400 {'хлеб': 50, 'молоко': 90}
print(cart.pop('чай', 0)) # 0
last = cart.popitem()
print(last, cart) # ('молоко', 90) {'хлеб': 50}
cart.clear()
print(cart) # {}Начиная с Python 3.7 словари сохраняют порядок вставки, поэтому popitem() удаляет последнюю добавленную пару. Для пустого словаря он вызывает KeyError. Оператор del cart['хлеб'] тоже удаляет ключ, но не возвращает значение.
Метод clear() очищает тот же объект, и это видно во всех переменных, которые на него ссылаются. Присваивание cart = {} создает новый пустой словарь, а остальные ссылки продолжают указывать на старый.
Создание и копирование: fromkeys и copy
Метод класса dict.fromkeys() строит словарь из набора ключей с одинаковым значением. Он удобен для заготовок и для удаления дубликатов с сохранением порядка.
scores = dict.fromkeys(['Анна', 'Борис', 'Вера'], 0)
print(scores) # {'Анна': 0, 'Борис': 0, 'Вера': 0}
unique = list(dict.fromkeys([3, 1, 3, 2, 1]))
print(unique) # [3, 1, 2]
bad = dict.fromkeys(['a', 'b'], [])
bad['a'].append(1)
print(bad) # {'a': [1], 'b': [1]}Последний пример показывает ловушку: всем ключам достается один и тот же список. Если значение изменяемое, создавайте словарь генератором: {k: [] for k in keys}.
Метод copy() делает поверхностную копию. Сам словарь новый, но вложенные списки и словари общие с оригиналом. Для полной независимой копии используйте copy.deepcopy().
import copy
original = {'name': 'Иван', 'tags': ['python']}
shallow = original.copy()
deep = copy.deepcopy(original)
shallow['tags'].append('sql')
print(original['tags']) # ['python', 'sql']
print(deep['tags']) # ['python']Методы, которые не меняют словарь, а только возвращают данные, удобно сочетать с функцией sorted(); примеры есть в статье о сортировке словаря. Еще больше практических приемов собрано на странице методов словаря, а формальное описание типа есть в документации Python.
Частые вопросы
Ответы на вопросы, которые чаще всего возникают при работе с методами словаря.
Чем get() отличается от setdefault()?
Оба возвращают значение по умолчанию, если ключа нет. Но get() словарь не меняет, а setdefault() добавляет в него отсутствующий ключ.
Почему d = d.update(...) превращает словарь в None?
Метод update() меняет словарь на месте и возвращает None. Вызывайте его без присваивания или используйте оператор d | other, который возвращает новый словарь.
Как проверить, есть ли ключ в словаре?
Используйте оператор in: 'name' in user. Устаревший метод has_key() был удален еще в Python 3. Проверка in работает по ключам, для значений пишут x in d.values().
Как удалить ключ во время перебора словаря?
Изменять размер словаря внутри цикла по нему нельзя, будет RuntimeError. Перебирайте копию ключей for k in list(d): или соберите новый словарь генератором.