2

我有 python 2.7 代码来对 FreqDist (即 NLTK 频率分布)中的值进行平方,并对所有平方求和。

例如,由此: 你应该得到: 2*2 + 1*1 + 1*1 + 1*1 = 7

这对我有用,但我想知道是否有比这“更好”的方法:

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

我之所以问,是因为我需要再次遍历 freq_dist 以获取其他内容;就在这段代码之后,所以我认为如果有更好的方法,必须循环两次并不是一个好习惯......

4

3 回答 3

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

使用生成器表达式

sum(i**2 for i in lst)

7

或者,列表推导也可以:

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

如果您稍后出于某种目的不需要平方值,那么生成器表达式是更好的选择,因为它只根据需要创建一次值,而列表推导在内存中创建整个列表。有关更多信息,请参阅比较列表理解与生成器的这个 SO 问题。

于 2012-05-26T19:57:45.670 回答
1

如果你使用 Numpy,你可以对数组进行平方:

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

如果您要进行任何重复的、繁重的计算,我建议您使用 Numpy。它会给你巨大的速度提升。

于 2012-05-26T19:59:51.813 回答
0

如果第二个循环依赖于total,不,不会有更好的方法来做到这一点。如果它没有这种依赖性,是的,更好(即更快)的方法是将来自另一个循环的工作包含在当前循环中。但实际上加速应该不显着。

于 2012-05-26T19:59:58.087 回答