Сначала второй вопрос, потому что он более простой:
Во-вторых, почему я не могу разделить на len (total_rating)?
Вы пытаетесь вычислить средний, правда? Итак, вы хотите разделить сумму оценок на количество оценок?
Хорошо. Итак, вы пытаетесь выяснить, сколько существует оценок. Какое правило говорит вам об этом? Похоже, вы рассчитываете подсчитать рейтинги с того места, где они хранятся. Где они хранятся? Это не total_rating
; вот где вы сохранили числовую сумму. Откуда взялись рейтинги? Они пришли из поиска названий фильмов в movie_ratings
. Таким образом, рейтинги были , а не на самом деле вообще; не на чем измерить len
оф. Правильно? Не совсем так. Какое правило определяет рейтинги, которые мы складываем? Мы ищем их в movie_ratings
по заголовку . Так сколько их там? Сколько есть титулов. Где хранились названия? Они были сопоставлены с расстояниями в neighbors
. Так что титулов столько, сколько соседей (что бы здесь ни значило слово «сосед»; я действительно не понимаю, почему вы так назвали его). Итак, , что - это то, что вы хотите len()
из.
Далее, чтобы исправить суммирование.
total_rating = 0
for i in neighbors[1]:
total_rating += movie_ratings[i]
Сначала вычисляется neighbors[1]
, которое будет одна из пар [distance_to_point, title]
, которая была .append
добавлена в список (при условии, что таких значений как минимум два, чтобы индекс [1]
действовал).
Затем l oop повторяется над этим двухэлементным списком, поэтому он выполняется дважды: в первый раз i
равно значению расстояния, а во второй раз - заголовку. Ошибка возникает из-за того, что заголовок является строкой, и вы пытаетесь вычислить с ней.
total_rating = 0
for i in neighbors:
title = neighbors[1]
total_rating += movie_ratings[title]
Это l oop заставляет i
принимать каждую из пар как значение. title = neighbors[1]
сломан; теперь мы полностью игнорируем значение i
и вместо этого всегда используем специфицированную пару c, а также пытаемся использовать пару (которая является списком) в качестве заголовка (нам нужна строка).
Предположительно, вы хотели:
total_rating = 0
for neighbor in neighbors:
title = neighbor[1]
total_rating += movie_ratings[title]
Обратите внимание, я использую более четкое имя для переменной l oop, чтобы избежать путаницы. neighbor
- одно из значений из списка neighbors
, то есть одна из пар расстояние-заголовок. Отсюда мы можем получить заголовок, а затем из данных рейтингов и заголовка мы можем получить рейтинг.
Я могу сделать его более понятным, используя распаковку аргументов:
total_rating = 0
for neighbor in neighbors:
distance, title = neighbor
total_rating += movie_ratings[title]
Вместо того, чтобы понимать причину появления индекса [1]
, теперь мы помечаем каждую часть значения neighbor
, а затем используем ту, которая имеет отношение к нашей цели.
Я могу сделать это проще, выполнив распаковку сразу:
total_rating = 0
for distance, title in neighbors:
total_rating += movie_ratings[title]
Я могу сделать его более элегантным, не пытаясь объяснить Python, как вычислять суммы, а просто сообщая ему, что суммировать:
total_rating = sum(movie_ratings[title] for distance, title in neighbors)
Здесь используется выражение генератора вместе со встроенной функцией суммы , которая делает именно то, что звучит.