Последовательно примените сортировку по score и фильтрацию по множеству запрещённых названий. Верните новую FilmCollection, не изменяя вход.
Конвейер обработки списка фильмов
Последовательно примените сортировку по score и фильтрацию по множеству запрещённых названий. Верните новую FilmCollection, не изменяя вход.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте конвейер, который последовательно обрабатывает набор фильмов. Конвейер должен выполнить два действия: сначала упорядочить фильмы по их рейтингу, затем исключить из набора фильмы, находящиеся в черном списке.
from dataclasses import dataclass
BLACK_LIST = ["Pirates of the Caribbean", 'Avengers']
@dataclass
class Film:
title: str
score: float
@dataclass
class FilmCollection:
items: list[Film]
class Pipeline:
def run(self, collection: FilmCollection) -> FilmCollection:
pass
Ответ
Последовательно примените сортировку по score и фильтрацию по множеству запрещённых названий. Верните новую FilmCollection, не изменяя вход.
class Pipeline:
def run(self, collection: FilmCollection) -> FilmCollection:
ordered = sorted(collection.items, key=lambda film: film.score,
reverse=True)
blocked = set(BLACK_LIST)
allowed = [film for film in ordered if film.title not in blocked]
return FilmCollection(allowed)
Здесь выбран порядок от высокого рейтинга к низкому; если нужен обратный, уберите reverse=True. При равных рейтингах сохраняется исходный порядок. Совпадение названия с чёрным списком точное, с учётом регистра.
Для расширяемого конвейера вынесите оба шага в отдельные преобразования. Фильтрация перед сортировкой могла бы сократить работу, но показанный вариант соблюдает заданную последовательность.