Алгоритмы обработки данных

Фильтрация и накопление результата

Содержание курса

Словарь частот: накопление счётчиков по ключу

Фильтрация даёт новый список, аккумулятор — одно число. Словарь частот работает иначе: результат — это словарь, где каждый уникальный элемент исходного списка становится ключом, а его значение — сколько раз этот элемент встретился.

Структура паттерна:

  1. Создать пустой словарь: freq = {}
  2. Перебрать список циклом for
  3. Для каждого элемента: если ключ уже есть в словаре — увеличить счётчик на 1, иначе — создать ключ со значением 1
  4. Вернуть 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 = {} должна быть до цикла. Если создать словарь внутри — он будет обнуляться на каждой итерации, и в итоге останется только последний обработанный элемент.