Сравнение объектов Python: lt и несовместимые группы

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Сравнение и хеширование Python: задачи на eq, lt и set.

Раздельное ранжирование партий

В клубе настольных игр ранжируют сыгранные партии по набранным очкам, опираясь на дандер-метод __lt__. Однако регламент клуба запрещает сопоставлять результаты напрямую, если встречи проходили в разных лигах: сравнивать между собой допустимо только партии внутри любительской или внутри профессиональной лиги. Если методу сравнения попадаются записи из разных лиг, он обязан возвращать NotImplemented, чтобы не создавать искусственный порядок между категориями. При прямом вызове оператора < для разнородных партий Python преобразует такой ответ в стандартный TypeError.

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

Реализуйте класс шахматной партии с избирательным оператором порядка для своей лиги и функцию раздельной сортировки, которая группирует партии и упорядочивает их без ошибок несопоставимости типов.

Что уже дано

В заготовке объявлен класс Game с конструктором и методом __lt__, а также функция group_games(games). Вспомогательные функции для проверки операций сравнения и группировки доступны во время выполнения тестов, реализовывать их не нужно.

Что нужно сделать

  1. Реализуйте класс Game(league, points):
  • Конструктор принимает строку league ("amateur" или "professional") и целое число набранных очков points (от 0 до 1 000 000). Сохраните их в публичных атрибутах league и points.
  • Метод __lt__(self, other) реализует строгое сравнение «меньше» (<). Сравнение допустимо только в том случае, если other является объектом класса Game и имеет ту же самую лигу, что и self (self.league == other.league). В этом случае возвращается булев результат сравнения self.points < other.points.
  • Если other принадлежит другой лиге или относится к постороннему типу, метод __lt__ обязан вернуть значение NotImplemented. Не выбрасывайте TypeError вручную: стандартный оператор Python сам возбудит TypeError, получив NotImplemented от обеих сторон.
  • Никаких дополнительных методов сравнения, равенства, хеширования или строкового представления реализовывать не требуется.
  1. Реализуйте функцию group_games(games):
  • Функция принимает список games (длиной от 0 до 200 элементов), содержащий исходные объекты Game.
  • Возвращает словарь dict[str, list[Game]], ключами которого являются только те лиги, партии которых присутствуют во входном списке.
  • Значением для каждого ключа является список всех соответствующих исходных объектов Game, отсортированных по возрастанию набранных очков points.
  • Если входной список games пуст, функция возвращает пустой словарь {}.
  • Единого порядка между лигами не существует: порядок ключей в словаре и взаимный порядок партий с одинаковым количеством очков не регламентируются.

Ввод и вывод

Стандартные потоки ввода stdin и вывода stdout в решении не используются: считывать ввод и вызывать print() не нужно. После выполнения кода учащегося проверяющая система считывает из пространства имён модуля класс верхнего уровня Game и функцию верхнего уровня group_games и вызывает их с проверочными аргументами.

Пример использования

games = [Game("amateur", 3), Game("professional", 7), Game("amateur", 1)]
groups = group_games(games)
print([game.points for game in groups["amateur"]])
print([game.points for game in groups["professional"]])

Вывод:

[1, 3]
[7]
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи