Создание словаря
# Литерал
person = {"name": "Alice", "age": 30, "city": "Москва"}
# Конструктор dict()
settings = dict(theme="dark", language="ru", debug=False)
# Из двух списков
keys = ["a", "b", "c"]
values = [1, 2, 3]
d = dict(zip(keys, values)) # {'a': 1, 'b': 2, 'c': 3}
# Dict comprehension
squares = {x: x**2 for x in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
Доступ к значениям
d = {"name": "Alice", "age": 30}
# По ключу (KeyError если нет)
print(d["name"]) # Alice
# get() — безопасный доступ
print(d.get("city")) # None (нет KeyError)
print(d.get("city", "Москва")) # 'Москва' (значение по умолчанию)
# Проверка наличия ключа
"age" in d # True
"email" in d # False
Изменение словаря
d = {"a": 1}
# Добавить / обновить
d["b"] = 2
d.update({"c": 3, "d": 4})
# Удалить
del d["a"]
value = d.pop("b") # удаляет и возвращает значение
value = d.pop("x", 0) # безопасно, вернёт 0 если нет ключа
# Очистить
d.clear()
# setdefault — добавить только если нет
d.setdefault("count", 0) # если нет "count" — ставит 0
d["count"] += 1
Итерация
d = {"name": "Alice", "age": 30, "city": "Москва"}
# Ключи (default)
for key in d:
print(key)
# Значения
for value in d.values():
print(value)
# Пары ключ-значение
for key, value in d.items():
print(f"{key}: {value}")
Слияние словарей
a = {"x": 1, "y": 2}
b = {"y": 20, "z": 3}
# Python 3.9+ (оператор |)
merged = a | b # {'x': 1, 'y': 20, 'z': 3}
a |= b # обновить a на месте
# Python 3.5+
merged = {**a, **b} # то же самое
collections.defaultdict
Автоматически создаёт значение для новых ключей:
from collections import defaultdict
# Подсчёт слов
text = "apple banana apple cherry banana apple"
counter = defaultdict(int)
for word in text.split():
counter[word] += 1
# defaultdict(int, {'apple': 3, 'banana': 2, 'cherry': 1})
# Группировка
groups = defaultdict(list)
data = [("alice", 1), ("bob", 2), ("alice", 3), ("bob", 4)]
for name, value in data:
groups[name].append(value)
# {'alice': [1, 3], 'bob': [2, 4]}
collections.Counter
Специализированный счётчик:
from collections import Counter
c = Counter("hello world")
print(c)
# Counter({'l': 3, 'o': 2, 'h': 1, 'e': 1, ' ': 1, 'w': 1, 'r': 1, 'd': 1})
print(c.most_common(3)) # [('l', 3), ('o', 2), ('h', 1)]
print(c["l"]) # 3
# Арифметика счётчиков
c1 = Counter(["apple", "banana", "apple"])
c2 = Counter(["banana", "cherry"])
print(c1 + c2) # Counter({'apple': 2, 'banana': 2, 'cherry': 1})
print(c1 - c2) # Counter({'apple': 2})
Вложенные словари
catalog = {
"electronics": {
"laptop": {"price": 50000, "stock": 10},
"mouse": {"price": 1500, "stock": 100},
},
"books": {
"python": {"price": 800, "stock": 50},
}
}
# Доступ
print(catalog["electronics"]["laptop"]["price"]) # 50000
# Безопасный доступ через get()
price = catalog.get("electronics", {}).get("tablet", {}).get("price", 0)
print(price) # 0
# Обновление вложенного значения
catalog["electronics"]["laptop"]["price"] = 45000
Инверсия словаря
original = {"a": 1, "b": 2, "c": 3}
inverted = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}
Если значения могут дублироваться:
from collections import defaultdict
original = {"a": 1, "b": 2, "c": 1}
inverted = defaultdict(list)
for k, v in original.items():
inverted[v].append(k)
# {1: ['a', 'c'], 2: ['b']}
Сортировка словаря
data = {"banana": 3, "apple": 5, "cherry": 1}
# По ключам
sorted_by_key = dict(sorted(data.items()))
# {'apple': 5, 'banana': 3, 'cherry': 1}
# По значениям (убывание)
sorted_by_value = dict(sorted(data.items(), key=lambda x: x[1], reverse=True))
# {'apple': 5, 'banana': 3, 'cherry': 1}
Практические паттерны
Кеш (memoization)
cache = {}
def expensive(n):
if n in cache:
return cache[n]
result = n ** 2 # допустим, долгая операция
cache[n] = result
return result
Диспетчер функций
def add(a, b): return a + b
def sub(a, b): return a - b
def mul(a, b): return a * b
ops = {"+": add, "-": sub, "*": mul}
def calculate(op, a, b):
return ops[op](a, b)
print(calculate("+", 3, 4)) # 7
Подсчёт частот из списка
items = ["a", "b", "a", "c", "b", "a"]
freq = {}
for item in items:
freq[item] = freq.get(item, 0) + 1
# {'a': 3, 'b': 2, 'c': 1}
# Или через Counter:
from collections import Counter
freq = Counter(items)
Словари — сердце Python-программирования. В тренажёре Python Lab раздел «Словари и множества» содержит 30 задач, включая реализацию LRU-кеша и структур данных на основе dict.