2

我理解下面的代码,除了下面的 sum 函数调用。我不明白 sum 函数究竟接受什么作为其参数的逻辑?里面的for循环是什么?那是什么东西??

def sim_distance(prefs,person1,person2):
  # Get the list of shared_items
  si={}
  for item in prefs[person1]:
    if item in prefs[person2]: si[item]=1

  # if they have no ratings in common, return 0
  if len(si)==0: return 0

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

  return 1/(1+sum_of_squares)
4

2 回答 2

3

所以那里有两个概念在起作用——sum还有一个列表理解。

sum_of_squares=sum([pow(prefs[person1][item]-prefs[person2][item],2)
                      for item in si])

首先,列表理解。

[pow(prefs[person1][item]-prefs[person2][item],2) for item in si]

这可以分解为for如下所示的循环:

result_list = [] # Note that this is implicitly created
for item in si:
    result_list.append(pow(prefs[person1][item]-prefs[person2][item], 2))

通过在每次迭代中运行pow函数、使用 each iteminsi并将结果附加到result_list. 假设循环会产生类似的结果[1, 2, 3, 4]- 现在sum所做的就是对列表的每个元素求和并返回结果。

至于sum函数接受什么作为参数的问题,它正在寻找一个可迭代的,它是可以迭代的任何东西(字符串、列表、字典的键/值等)。就像您在for循环中看到的一样,sum将每个项目添加到可迭代对象(在本例中为列表)并返回总数。还有一个可选start参数,但我会首先专注于理解基本功能:)

于 2012-11-09T02:20:53.163 回答
1

这只是一个列表理解- 所以你的“for”循环用于构建一个 diff 值的列表,以 2 的幂为单位

它几乎是一样的:

lVals = []
for item in si:
    lVals.append(pow(prefs[person1][item]-prefs[person2][item],2))

sum_of_squares = sum(lVals)
于 2012-11-09T02:17:14.453 回答