我正在阅读编程集体智能这本书,下面的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是人物到电影评级的地图,电影评级是另一个评级名称地图。
答案 0 :(得分:6)
首先,它构建一个包含以下结果的列表:
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")
然后将它们添加起来。
答案 1 :(得分:2)
如果对pow的调用被显式使用'**'指数运算符替换,那么这可能是 little 更具可读性:
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)
现在看起来更简单了。
具有讽刺意味的是,为了追求可读性,我们还进行了一些性能优化(两项通常是相互排斥的):
这是一种很棒的语言还是什么?!
答案 2 :(得分:1)
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 )
Sum(第2行)一个列表,它包含在第4行中为第11行指定的列表中定义的每个'item'计算的值,其中第13行的条件适用于。
答案 3 :(得分:0)
它计算prefs[person1][item]
prefs[person2][item]
字典item
中每prefs
个person1
和prefs
之差的平方和在person2
的{{1}}字典中。
换句话说,假设person1
和person2
对电影Ratatouille有评分,person1
评分5星,person2
评分它2星。
prefs[person1]['Ratatouille'] = 5
prefs[person2]['Ratatouille'] = 2
person1
的评分和person2
评分之差的平方为3^2 = 9
。
它可能正在计算某种Variance。