🏠 Домашнее задание

⚡ Кратко: домашнее задание

fromkeys(), get(), setdefault(), keys(), values() и items() повторяются как базовый набор методов словаря.

View objects отражают изменения словаря, а list(view) создаёт снимок.

Вложенные структуры требуют цепочки ключей и индексов.

copy() копирует только внешний словарь, deepcopy() копирует вложенные объекты.

Dict comprehension подходит для преобразования и фильтрации словаря.

Функции повторяются через def, pass, return, *args/**kwargs и LEGB.

Практическая задача со скобками решается стеком и словарём соответствий.

global работает, но параметры и return обычно дают более предсказуемый код.

Топ-3 ошибки: менять словарь во время итерации по items(); ожидать независимых списков от dict.fromkeys(keys, []); путать локальную переменную и global.

Текст задания из LMS / источника

Реверс словаря

Поменяйте местами ключи и значения. Если значения повторяются, добавьте ключи в список.

data = {"a": 1, "b": 2, "c": 1, "d": 3}

Пример вывода: {1: ['a', 'c'], 2: ['b'], 3: ['d']}

Счётчик букв в словах

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

words = ["anna", "bennet", "john"]

Пример вывода: {'anna': {'a': 2, 'n': 2}, ...}

Распределение студентов по группам

Распределите студентов по группам Отличники, Хорошисты, Троечники, Не сдали.

students = {"Аня": 92, "Боря": 76, "Ваня": 65, "Галя": 48, "Дима": 88, "Ева": 54}

Пример вывода: словарь групп со студентами

Пошаговое решение

Реверс словаря

def reverse_dictionary(data):
    result = {}
    for key, value in data.items():
        result.setdefault(value, []).append(key)
    return result

print(reverse_dictionary({"a": 1, "b": 2, "c": 1, "d": 3}))

setdefault() создаёт список только при первом появлении значения.

Счётчик букв

def count_letters(words):
    result = {}
    for word in words:
        result[word] = {}
        for char in word:
            result[word][char] = result[word].get(char, 0) + 1
    return result

print(count_letters(["anna", "bennet", "john"]))

Вложенный словарь хранит частоты внутри каждого слова отдельно.

Группы студентов

def distribute_students(students):
    groups = {"Отличники": {}, "Хорошисты": {}, "Троечники": {}, "Не сдали": {}}
    for name, score in students.items():
        if score >= 85:
            groups["Отличники"][name] = score
        elif score >= 70:
            groups["Хорошисты"][name] = score
        elif score >= 50:
            groups["Троечники"][name] = score
        else:
            groups["Не сдали"][name] = score
    return groups

students = {"Аня": 92, "Боря": 76, "Ваня": 65, "Галя": 48, "Дима": 88, "Ева": 54}
print(distribute_students(students))

Границы диапазонов проверяются сверху вниз.

Проверка в VS Code

  1. Создайте файл main.py и перенесите решение.
  2. Запустите python main.py в терминале.
  3. Сравните вывод с примером из задания.
  4. Проверьте крайние случаи: пустые коллекции, повторяющиеся значения и некорректные параметры.