Я пытаюсь создать метод, который использует определенную систему, чтобы рекомендовать фильмы человеку. Я предоставлю более подробно.
Допустим, у нас есть следующие два словаря:
#this is a dictionary where the keys are people and the items are the movies they liked
person_to_movies = {'James': ['Up', 'Fight Club'],
'Lily': ['Harry Potter', 'Up', 'Wreck it Ralph']
'Albus': ['50 Shades of Gray', 'Iron Man']
'Severus': ['The Matrix', 'Spiderman 1', 'Captain America', 'Iron Man', 'Joker']}
#this is a dictionary of who is friends with whom
person_to_friends = {'James': ['Albus', 'Harry', 'Lily']
'Albus': ['James', 'Lily']
'Harry': ['James', 'Lily', 'Severus', 'Ronald']
'Ronald': ['Harry']}
Что мой метод должен сделать, это взять 3 параметра: словарь "человек в друзья", словарь "человек в кино" и человекчто они рекомендуют фильмы. так, например: recommend_movies(person_to_friends, person_to_clubs, 'James')
будет допустимым вызовом.
Что он должен сделать, это (в этом примере)
a) если другу Джеймса нравится фильм, то этот фильм получает +1 балл
б) если другу Джеймса нравится фильм и оказывается, что есть еще один фильм, который им обоим нравится, то фильм, который нравится другу Джеймса, получает еще одно очко.
Примером этого может быть то, что, поскольку Джеймс и Лили дружат, фильм «Разрушь его Ральф» получает очко, но поскольку Лили и Гарри нравятся оба фильма «Вверх», «Разрушить это Ральф» получает другоготочка
формат вывода представляет собой список кортежей, в котором каждый кортеж имеет два элемента: фильм и его точки
Вот что у меня есть
recommend_movies(p2f: Dict[str, List[str]],
p2m: Dict[str, List[str]],
p: str,) -> List[Tuple[str, int]]:
ignore_movies = []
#we want to ignore the movies the person has already watched
if p in p2m:
ignore_movies = p2m[p]
#we'll make a list of their friends that like at least 1 movie
friends_list = p2f[p]
for friend in friends_lst:
if friend not in p2m:
friends_lst.remove(friend)
#now let's make a list of the movies the person's friends have liked
movies_lst = []
for friend in friends_lst:
for movie in p2m[friend]:
if movie not in ignore_movies:
movies_lst.append(movie)
movie_recommendations = {}
for movie in movies_lst:
if movie not in movie_recommendations:
movie_recommendations[movie] = 1
elif movie in movie_recommendations:
movie_recommendations[movie] += 1
return [(k, v) for k, v in movie_recommendations.items()]
Этот код, кажется, работает для (а), где, если другу человека нравится фильм, он добавляет к числу, но я не знаю, что делать для (б), если другу человека нравится фильм, а друг иУ человека есть еще один взаимно любимый фильм.
Таким образом, вывод, который я получаю для этого примера, [('50 Shades of Gray', 1), ('Iron Man', 1), ('Harry Potter', 1), ('Wreck it Ralph', 1)]
вместо [('50 Shades of Gray', 1), ('Iron Man', 1), ('Harry Potter', 2), ('Wreck it Ralph', 2)]