Python Lab

Словари Python: методы и паттерны

Создание, доступ, итерация, вложенные словари, defaultdict, Counter. Полное руководство с примерами.

10 декабря 2025 г.·9 мин чтения
dictсловариcollectionspython basics

Создание словаря

# Литерал
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.

Хочешь закрепить знания?

Попробуй решить задачи на Python в интерактивном тренажёре

К задачам