2

以下の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

したがって、そこでは2つの概念が機能してい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これにより、各反復で関数を実行し、各iteminsiを使用して結果をに追加することにより、値のリストが作成されresult_listます。ループの結果が次のように[1, 2, 3, 4]なったとしましょうsum。これで、リストの各要素を合計して結果を返すだけです。

関数が引数として何sumを受け入れるかという質問に関しては、反復可能なものを探しています。これは、反復可能なもの(文字列、リスト、辞書のキー/値など)です。forループで見られるようsumに、iterable(この場合はリスト)に各アイテムを追加し、合計を返します。オプションの引数もありますがstart、最初に基本機能を理解することに焦点を当てます:)

于 2012-11-09T02:20:53.163 に答える
1

これは単なるリスト内包表記です。したがって、「for」ループを使用して、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 に答える