python sum 函数中可以使用条件语句吗
高洛峰
高洛峰 2017-04-17 17:52:13
0
2
1157

我在学习协同过滤,遇到这样一段代码

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 prefs[person1] if item in prefs[person2]])

  return 1/(1+sum_of_squares)

比较困惑的是下面这段代码,为什么sum里面可以写for 循环呢,这个是什么意思,为什么我写了个类似的函数就会报错

sum([pow(prefs[person1][item]-prefs[person2][item],2) 
                          for item in prefs[person1] if item in prefs[person2]])
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全員に返信(2)
刘奇

sum で受け入れられる最初のパラメータは反復可能です。この for ループの意味を知りたい場合は、ジェネレーターとそのジェネレーターに関連する構文シュガーを確認する必要があります。ポスター [i for i in range(5)] # 结果为[0,1,2,3,4]

の簡単な例を次に示します。
いいねを押す +0
洪涛

ここでの for または ifsum 自体とは何の関係もありません。@大鶉が言ったように、sum は反復可能なオブジェクトをパラメーターとして受け入れます。この例の反復可能なオブジェクトは単なるものです。リスト内包表記を使用して生成された list


リスト内包表記 (逐次生産) を簡単に紹介しましょう。

これは

関数型プログラミング の風味を備えた、直感的でエレガントな構文です。

その名前が示すように、

シリーズを生成するために使用されます。

したがって、重要な原則があります:

今日のコードの目的がリストを生成することである場合は、リストの使用を検討する必要があります。そうでない場合は、リストをまったく使用すべきではありません。


使用法を見てみましょう。リストを生成するには、文字通り 2 組の角括弧

(リストのリテラル生成構文) を使用して、[] 反復を挟みます。 for...in... を使用してアクセスした要素は、リスト内の各要素を順番に作成するために使用されます。 for

例を見てみましょう。今日、整数のリスト

があり、各要素が lst の要素の 2 乗である別のリスト lst2 を作成するとします。 リーリー lstこれを行うために標準の

ループを使用しましたが、

リスト内包表記for...in... を使用すると、同じことをより簡潔かつエレガントに実行できます。 リーリー この例では、

内の要素を順番に取り出し、二乗演算を実行して for i in lst の新しい要素になります。 これは lst 関数を彷彿とさせますが、lst2 マッピング map を使用して同様の効果を実現することもできます。 リーリー は、2 番目のパラメーター (反復可能なオブジェクト) の要素を順番に訪問し、その要素をパラメーターとして使用して最初のパラメーター (単一パラメーター関数) を呼び出します。つまり、順番に取り出します。 1、2、3、4 をパラメータ

として使用して、匿名関数

を呼び出します。 map xしかし、リスト内包の方がより直観的であることがわかり、リスト内包の lambda x:x**2 ステートメントは

の良い代替品であると言えます。

for map

について考えるとき、反復可能なオブジェクトに対してフィルタリング アクションを実行する
を思い浮かべるでしょう。

mapたとえば、filter に奇数のみを表示したい場合:

リーリー

lst2 も 2 番目のパラメーター (反復可能なオブジェクト) を参照し、それを引数として順番に取り出し、操作の結果が true の場合 ( ) の場合、戻り値は新しい要素として保持されます。それ以外の場合 (

) はフィルターで除外されます。

filterそして今、True にはリスト内包表記も含まれています。False のように書くことができます。リーリー

もはるかに単純です。リスト内包の if ステートメントは filter の良い代替品であると言えます。


これを見た後、あなたはすでに理解していると思います:

リーリー

このコードは、まず for...in... ステートメントと if ステートメントを含むリスト内包表記を実行してリストを生成し、次にそのリストを引数として使用して sum 関数を呼び出します。


結論:

  1. for...in...ifsum に直接関係しません。

  2. for...in...if はリスト理解の重要な構文です。

  3. リスト内包表記は、反復可能なオブジェクトを使用してリストを生成するのに役立ちます。

  4. リスト内包表記は、mapfilter の代替として適しています。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート