Словари в Python (dict): понятное руководство с примерами
Если вы ищете «Словари в Python: понятное руководство с примерами», вы по адресу. Dict — ассоциативный массив, где каждому ключу соответствует значение. Это незаменимый тип данных для конфигураций, кэшей, подсчётов и быстрых поисков.
Что такое словарь dict и чем он полезен
Словарь — это коллекция пар ключ–значение с быстрым доступом по ключу (амортизированно O(1)). Ключи должны быть хешируемыми (обычно неизменяемые типы: str, int, float, tuple из хешируемых объектов). С 3.7+ словари сохраняют порядок вставки ключей, что удобно для предсказуемого вывода и сериализации.
Создание словарей
# Литеральный синтаксис
user = {"name": "Alex", "age": 28}
# Через dict()
user2 = dict(name="Sam", age=21)
# Из списка пар
pairs = [("a", 1), ("b", 2)]
mapping = dict(pairs)
# fromkeys: создаёт ключи с одним значением
empty_scores = dict.fromkeys(["math", "cs"], 0) # {"math": 0, "cs": 0}
# Словарь c составным ключом (кортеж)
grid = { (0, 0): "empty", (1, 2): "wall" }
# Небольшой пример генератора словаря (dict comprehension)
squares = {n: n*n for n in range(5)} # {0:0, 1:1, 2:4, 3:9, 4:16}
Чтение, запись и безопасный доступ
Доступ по ключу через квадратные скобки выдаёт ошибку KeyError, если ключа нет. Метод get возвращает None или значение по умолчанию — это безопаснее.
profile = {"name": "Alex", "city": "Minsk"}
# Чтение
name = profile["name"] # "Alex"
city = profile.get("city") # "Minsk"
lang = profile.get("lang", "ru") # "ru" (нет ключа, вернули дефолт)
# Запись и обновление
profile["age"] = 28 # Добавили ключ
profile["city"] = "Vilnius" # Обновили значение
setdefault: инициализация при отсутствии ключа
data = {}
# Если "tags" нет, создадим со значением [] и вернём его
lst = data.setdefault("tags", [])
lst.append("python")
# data == {"tags": ["python"]}
Совет: setdefault удобен для группировок, но при частых вызовах может быть медленнее явной проверки. Для серьёзных нагрузок рассмотрите collections.defaultdict.
Объединение словарей: update и оператор |
base = {"host": "localhost", "port": 8000}
override = {"port": 8080, "debug": True}
# Мутирующее объединение
base.update(override)
# base == {"host": "localhost", "port": 8080, "debug": True}
# Нематирующее объединение (Python 3.9+)
cfg1 = {"a": 1} | {"b": 2} # {"a":1, "b":2}
cfg2 = {"a": 1} | {"a": 3, "c": 4} # {"a":3, "c":4}
# Объединение с приоритетом левого словаря
left_priority = {"a": 1, "b": 2} | {"b": 100}
# {"a": 1, "b": 100}
Перебор словаря: keys, values, items
stats = {"ok": 10, "warn": 3, "error": 1}
# По умолчанию перебираются ключи
for key in stats:
print(key)
# Явно по ключам/значениям
for key in stats.keys():
print(key)
for value in stats.values():
print(value)
for key, value in stats.items():
print(key, value)
# Проверка наличия ключа
if "error" in stats:
print("Есть ошибки")
Коллекции keys, values и items — «представления» (views), они лёгкие и отражают изменения словаря на лету. Для материализации используйте list(stats.keys()).
Удаление и очистка
d = {"a": 1, "b": 2, "c": 3}
val = d.pop("b") # Удаляет и возвращает значение (2)
# d == {"a": 1, "c": 3}
item = d.popitem() # Удаляет и возвращает последнюю пару ("c", 3)
del d["a"] # Удаляет ключ "a"
d.clear() # Полная очистка
Практика: подсчёт и группировка данных
Подсчёт частоты слов
text = "python is great and python is fast"
freq = {}
for word in text.split():
freq[word] = freq.get(word, 0) + 1
print(freq) # {'python': 2, 'is': 2, 'great': 1, 'and': 1, 'fast': 1}
Совет: для подсчёта часто удобно использовать collections.Counter, но базовый dict тоже справляется отлично и прозрачно.
Группировка по первой букве
words = ["map", "max", "min", "sum", "sorted"]
groups = {}
for w in words:
key = w[0]
groups.setdefault(key, []).append(w)
print(groups) # {'m': ['map', 'max', 'min'], 's': ['sum', 'sorted']}
Порядок, копирование и вложенность
- Порядок ключей сохраняется с Python 3.7+, перебор идёт в порядке вставки.
- Поверхностная копия: d.copy() или dict(d). Глубокая копия для вложенных структур: copy.deepcopy(d).
- Неизменяемость ключей: ключи должны быть хешируемыми. Списки и dict нельзя использовать как ключи, кортежи — можно, если внутри только хешируемые элементы.
import copy
nested = {"user": {"name": "Alex", "tags": ["py", "dev"]}}
shallow = nested.copy()
deep = copy.deepcopy(nested)
shallow["user"]["name"] = "Sam"
print(nested["user"]["name"]) # "Sam" — поверхностная копия делит вложенную ссылку
deep["user"]["name"] = "Kate"
print(nested["user"]["name"]) # "Sam" — глубокая копия изолирована
Сериализация в JSON
Словари напрямую сериализуются в JSON: ключи должны быть строками (или будут приведены к строкам).
import json
user = {"name": "Alex", "age": 28, "tags": ["python", "web"]}
payload = json.dumps(user, ensure_ascii=False)
print(payload) # {"name": "Alex", "age": 28, "tags": ["python", "web"]}
Частые ошибки и лучшие практики
- KeyError: используйте get, in или setdefault, если ключ может отсутствовать.
- Не мутируйте словарь во время прямого перебора по нему — сначала соберите список ключей: for k in list(d): ...
- Для объединения предпочитайте | в новых версиях Python — это читаемо и немутирующе.
- Продумывайте тип ключей заранее: строки для конфигов, кортежи для координат/составных ключей.
- Храните только необходимое: большие вложенные структуры усложняют копирование и сериализацию.
Мини-чеклист перед собеседованием
- Отличаете [] и get, понимаете KeyError.
- Знаете update, pop, popitem, clear, setdefault, | и |=.
- Умеете перебирать keys, values, items и проверять принадлежность ключа.
- Помните, что порядок ключей сохраняется (3.7+).
- Понимаете разницу между поверхностной и глубокой копией.
Куда двигаться дальше
Освоив дикты, вам будет проще работать с конфигами, API и данными. Хотите системно прокачать Python с практикой и проектами? Рекомендую пошаговый курс «Python с Нуля до Гуру» с упражнениями и проверкой знаний — отличный способ быстро перейти от основ к уверенной разработке.
Теперь вы знаете «Словари в Python: понятное руководство с примерами». Попробуйте переписать пару своих задач под dict — и вы сразу почувствуете прирост скорости и читаемости кода.
-
Создано 01.12.2025 17:01:46
-
Михаил Русаков

Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.