class Filter:
def __init__(self):
self.year_to = None
self.year_from = None
self.genres = set()
#ну и так далее
def check(self, obj) -> bool:
#делаем цепочку условий отсева вида "условие_актуально and условие_не_выполняется"
#ну или как там у тебя к году фильма обратиться?
if self.year_to is not None and obj['year'] > self.year_to:
return False
if self.year_from is not None and obj['year'] < self.year_from:
return False
#obj['genres'] должен быть коллекцицей жанров, а не строкой вида жанр1|жанр2
if self.genres and self.genres.isdisjoint(obj['genres']):
return False
#и так далее, столько условий, сколько надо
#а если дошли до конца, то фильм подошел
return True
flt = Filter()
flt.genres = set(['Drama', 'Romance']) #или вытаскиваешь жанры из аргументов командной строки
flt.year_from = 2010
#бум, список подходящих под критерии фильмов
filtered = list(filter(flt.check, movies))
#если нужно N лучших, то сортируешь по рейтингу
filtered.sort(key = lambda m: ... )
filtered = filtered[0:N]
from dataclasses import dataclass
@dataclass
class Movie:
#__slots__ позволяет сэкономить память, если набор атрибутов объекта известен заранее и неизменен.
#полезно для маленьких объектов, которые будут существовать в большом количестве
__slots__ = ('id', 'name', 'year', 'genres', 'rating')
id: str #int?
name: str
year: int
genres: set
rating: float
#конструктор датакласс сгенерирует сам
Тогда у вас будет функция для повышения статы типа