📖 Теория

⚡ Кратко: теория

Практикум 9 закрепляет set, dict, frozenset и вложенные структуры.

Для чисел, кратных 3 или 5, подходит set comprehension с условием.

Общие ключи двух словарей удобно искать через пересечение set(dict1) & set(dict2).

Список строк превращается в словарь длин через dict comprehension.

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

Пустые значения можно удалить comprehension с проверкой truthiness.

frozenset нужен как ключ, когда набор элементов не должен зависеть от порядка.

В задачах с вводом отделяйте чистую логику от input(), чтобы проще тестировать.

Топ-3 ошибки: проверять подмножество словаря только по ключам; терять рецепты с одинаковым набором ингредиентов; использовать set как ключ вместо frozenset.

Как выбирать структуру

Практикум построен вокруг выбора структуры данных. Если нужен набор уникальных значений - set. Если нужен поиск по имени - dict. Если набор должен быть ключом - frozenset.

  • set comprehension - фильтрация и уникальность
  • dict comprehension - преобразование списка в словарь
  • items() - проверка пар ключ-значение
  • setdefault() - группировка нескольких значений под одним ключом

Подмножество словаря

Для словаря недостаточно проверить, что ключи dict1 есть в dict2. Значения тоже должны совпадать.

dict1 = {"a": 1, "b": 2}
dict2 = {"a": 1, "b": 2, "c": 3}

is_subset = all(item in dict2.items() for item in dict1.items())
print(is_subset)

Рецепты и frozenset

В рецептах порядок ингредиентов не должен влиять на ключ. frozenset решает это: frozenset(['egg', 'milk']) равен frozenset(['milk', 'egg']).

recipes = {
    ("flour", "egg", "milk"): "Pancakes",
    ("milk", "flour", "egg"): "Waffles",
}

grouped = {}
for ingredients, recipe in recipes.items():
    grouped.setdefault(frozenset(ingredients), []).append(recipe)

print(grouped[frozenset(["egg", "milk", "flour"])])

Замечание по источнику

В задании "Потерянные страницы книги" текст задачи говорит о замене None на "Страница потеряна", но пример вывода в источнике относится к координатной сетке. В уроке решение следует формулировке задачи.

Проверить по документации: Для production-кода дополнительно проверяйте правила обработки пустых значений: None, пустая строка, 0 и пустой список могут иметь разный бизнес-смысл.