2

FreqDist (つまり、NLTK 度数分布) の値を二乗し、すべての二乗を合計する Python 2.7 コードがあります。

たとえば、次のようになります: 2*2 + 1*1 + 1*1 + 1*1 = 7

これは私にとってはうまくいきますが、これよりも「より良い」方法があるかどうか疑問に思っていました:

        for word, frequency in t.freq_dist.iteritems():
            total += frequency*frequency

他の何かのために freq_dist をもう一度ループする必要があるため、私は尋ねています。このコードの直後なので、より良い方法があれば、2回ループするのは良い習慣ではないと思いました...

4

3 に答える 3

1
lst = [2, 1, 1, 1]

ジェネレータ式の使用:

sum(i**2 for i in lst)

与える

7

あるいは、リスト内包表記も機能します。

sum([i**2 for i in lst])

後でなんらかの目的で 2 乗値が必要ない場合は、必要に応じて 1 回だけ値を作成するジェネレーター式を使用することをお勧めしますが、リスト内包表記ではリスト全体をメモリ内に作成します。詳細については、この SO question comparison list comprehension vs generatorsを参照してください。

于 2012-05-26T19:57:45.670 に答える
1

Numpy を使用する場合は、配列を 2 乗するだけです。

>>> from numpy import array
>>> values = array([2, 1, 1, 1])
>>> sum(values**2)
7

反復的で重い計算を行う場合は、Numpy を使用することをお勧めします。大幅なスピードアップを実現します。

于 2012-05-26T19:59:51.813 に答える
0

2 番目のループが に依存している場合total、いいえ、それを行うためのより良い方法はありません。そのような依存関係がない場合、はい、より良い (つまり、より高速な) 方法は、現在のループ内に他のループからの作業を含めることです。しかし実際には、高速化は重要ではありません。

于 2012-05-26T19:59:58.087 に答える