Понимание Python - PullRequest
       20

Понимание Python

0 голосов
/ 10 ноября 2009

Я читаю книгу «Программирование коллективного разума». Что именно делает следующий фрагмент кода Python?

  # Add up the squares of all the differences 
  sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2) 
                      for item in prefs[person1] if item in prefs[person2]]) 

Я пытаюсь поиграть с примерами на Java.

Prefs - это карта человека с рейтингами фильмов, рейтинги фильмов - это еще одна карта имен с рейтингами.

Ответы [ 4 ]

6 голосов
/ 10 ноября 2009

Сначала он создает список, содержащий результаты из:

for each item in prefs for person1:
    if that is also an item in the prefs for person2:
        find the difference between the number of prefs for that item for the two people
        and square it (Math.pow(x,2) is "x squared")

Затем они складываются.

2 голосов
/ 10 ноября 2009

Это может быть немного более читабельным, если вызов pow был заменен явным использованием оператора возведения в степень '**':

sum_of_squares=sum([(prefs[person1][item]-prefs[person2][item])**2
                   for item in prefs[person1] if item in prefs[person2]])

Удаление некоторых инвариантов также помогает удобочитаемости:

p1_prefs = prefs[person1]
p2_prefs = prefs[person2]

sum_of_squares=sum([(p1_prefs[item]-p2_prefs[item])**2
                      for item in p1_prefs if item in p2_prefs])

Наконец, в последних версиях Python нет необходимости в нотации для понимания списка, sum будет принимать выражение генератора, поэтому [] также можно удалить:

sum_of_squares=sum((p1_prefs[item]-p2_prefs[item])**2
                      for item in p1_prefs if item in p2_prefs)

Кажется, теперь немного проще.

По иронии судьбы, в целях читабельности мы также провели некоторую оптимизацию производительности (две попытки, которые обычно взаимоисключающие):

  • поднял инварианты из цикла
  • заменил вызов функции pow на встроенную оценку оператора **
  • удалено ненужное построение списка

Это отличный язык или что?!

1 голос
/ 10 ноября 2009
01 sum_of_squares =
02 sum(
03  [
04      pow(
05         prefs[person1][item]-prefs[person2][item],
06         2
07      ) 
08    for
09       item
10    in
11       prefs[person1]
12    if
13       item in prefs[person2]
14  ]
15 )

Сумма (строка 2) списка, который состоит из значений, вычисленных в строках 4-7 для каждого «элемента», определенного в списке, указанном в строке 11, для которого выполняется условие в строке 13.

0 голосов
/ 10 ноября 2009

Он вычисляет сумму квадратов разности между prefs[person1][item] и prefs[person2][item] для каждого item в словаре prefs для person1, который также находится в словаре prefs для person2 .

Другими словами, скажем, что и person1, и person2 имеют рейтинг для фильма Рататуй , с person1 оценкой 5 звезд и person2 оценкой 2 звезд. *

prefs[person1]['Ratatouille'] = 5
prefs[person2]['Ratatouille'] = 2

Квадрат разницы между рейтингом person1 и person2 равен 3^2 = 9.

Вероятно, он вычисляет какую-то дисперсию .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...