Фильтрация и накопление результата
Содержание курса
Словарь частот: накопление счётчиков по ключу
Фильтрация даёт новый список, аккумулятор — одно число. Словарь частот работает иначе: результат — это словарь, где каждый уникальный элемент исходного списка становится ключом, а его значение — сколько раз этот элемент встретился.
Структура паттерна:
- Создать пустой словарь:
freq = {} - Перебрать список циклом
for - Для каждого элемента: если ключ уже есть в словаре — увеличить счётчик на
1, иначе — создать ключ со значением1 - Вернуть
freq
Вот прямая реализация через if/else:
def count_words(words):
freq = {}
for word in words:
if word in freq:
freq[word] += 1
else:
freq[word] = 1
return freq
print(count_words(["яблоко", "груша", "яблоко", "слива", "груша", "яблоко"]))
# {'яблоко': 3, 'груша': 2, 'слива': 1}
Ветка if word in freq проверяет, есть ли уже такой ключ. Если да — просто прибавляем 1. Если нет — впервые встречаем этот элемент, поэтому ставим счётчик 1.
Эта проверка вручную — рабочий вариант, но есть более компактная запись через dict.get():
def count_words(words):
freq = {}
for word in words:
freq[word] = freq.get(word, 0) + 1
return freq
print(count_words(["яблоко", "груша", "яблоко", "слива", "груша", "яблоко"]))
# {'яблоко': 3, 'груша': 2, 'слива': 1}
freq.get(word, 0) возвращает текущее значение по ключу word, а если ключа нет — возвращает 0. Затем прибавляем 1 и записываем результат обратно. Однострочная запись делает ровно то же самое, что if/else, только без явной проверки.
Оба варианта дают идентичный результат. Для новичка if/else нагляднее — сразу видно логику. get() короче и часто встречается в реальном коде, поэтому полезно знать оба.
Проверим на списке оценок, чтобы посмотреть, какие баллы встречались чаще всего:
scores = [85, 90, 85, 70, 90, 85, 70, 60]
print(count_words(scores))
# {85: 3, 90: 2, 70: 2, 60: 1}
Функция одинаково работает со строками и числами — ключом словаря может быть любой неизменяемый тип. Порядок ключей в выводе соответствует порядку первого появления каждого элемента в списке.
Важно: инициализация freq = {} должна быть до цикла. Если создать словарь внутри — он будет обнуляться на каждой итерации, и в итоге останется только последний обработанный элемент.
