Словари: храним данные по именам, а не по номерам
💻 Информатика · 9 класс
Словарь (dict) сопоставляет каждому ключу значение: вместо «элемент номер 3» — «оценки Ани» или «цена банана». Разберём создание, чтение, метод get и частотный анализ слов.

Идея словаря
Список индексируется числами: marks[0]. Словарь индексируется ключами: marks['Аня']. Ключ должен быть хешируемым: подходят обычные строки, числа и кортежи из хешируемых элементов. Список не подходит; кортеж с вложенным списком тоже вызовет TypeError. Ключи уникальны: если присвоить существующему ключу новое значение, старое будет забыто. Пустой словарь создают фигурными скобками data = {}.
Пример 1. Журнал оценок
def make_journal():
return {'Аня': [5, 4], 'Борис': [3, 5, 5]}
def add_mark(journal, name, mark):
journal.setdefault(name, [])
journal[name].append(mark)
return journal
def average_mark(journal, name):
marks = journal.get(name)
if not marks:
return None
return sum(marks) / len(marks)Метод setdefault сначала проверяет: если ключа нет, он создаёт пустой список; затем append добавляет оценку. Так новый ученик появляется в журнале автоматически, без лишних if. Метод get возвращает None (или заданное значение по умолчанию), если ключа нет — это способ избежать ошибки KeyError.
Обращение journal['Вера'] при отсутствующем ключе выбросит KeyError. Поэтому перед обращением проверяйте условие 'Вера' in journal или используйте get.
Словарь не сортируется сам
Важно не путать два факта. С Python 3.7 гарантирован порядок вставки: словарь помнит, в каком порядке пары добавлялись. Но автоматической сортировки по алфавиту или по значению нет! Для упорядоченного вывода используйте встроенную функцию sorted: sorted(d) отсортирует ключи, sorted(d.items()) — пары. Повторное присваивание существующего ключа не меняет его позицию, а удалённый и заново добавленный ключ переходит в конец.
Пример 2. Частотный словарь
Классическая задача — посчитать, сколько раз каждое слово встретилось в тексте.
def count_words(text):
counts = {}
for word in text.lower().split():
counts[word] = counts.get(word, 0) + 1
return counts
print(count_words('Мама мыла мама раму'))
# {'мама': 2, 'мыла': 1, 'раму': 1}Идея в одной строке: получить старое значение (если слова ещё не было — 0) и прибавить 1. Для непустого словаря самое частое слово можно найти через max(counts, key=counts.get). Пустой словарь нужно обработать отдельно: max без значения по умолчанию вызовет ValueError. При равной частоте здесь выбирается первый из максимальных ключей в порядке обхода. Подсчёт разделяет слова только пробелами: пунктуация пока остаётся частью слова.
Проверь себя
- Что выведет d = {'a': 1}; d['a'] = 2; print(d)? Ответ: {'a': 2} — старое значение перезаписано.
- Как прочитать значение, не рискуя получить KeyError? Ответ: d.get('ключ') вернёт None, а d.get('ключ', 0) — 0 при отсутствии ключа.
- d = {'б': 1, 'а': 2}. Что вернёт sorted(d) и почему? Ответ: ['а', 'б'] — sorted возвращает новый отсортированный список ключей, сам словарь при этом не изменится.
- Можно ли ключом сделать список? Ответ: нет — списки изменяемы, возникнет TypeError. Подойдут строки, числа и кортежи из хешируемых элементов.
Кратко о главном
Словарь хранит пары ключ: значение; ключи уникальны и должны быть хешируемыми. d.get возвращает значение по умолчанию для отсутствующего ключа; неверный нехешируемый ключ всё равно вызовет TypeError. Порядок вставки сохраняется (с Python 3.7), но сортировку делает только функция sorted. Частотный словарь — универсальный приём для подсчёта чего угодно.