使用生成器时,您只能一次拉出物品。另一种方法是将生成器加载到列表中并执行多次传递,但这会影响性能和内存分配。
谁能想到一种更好的方法来一次通过生成器计算以下指标。理想情况下,代码会计算计数、总和、平均值、标准差、最大值、最小值和您能想到的任何其他统计数据。
更新
这个要点中的初始可怕代码。请参阅此处的要点:https ://gist.github.com/3038746
在这里使用来自@larsmans 的好建议是我采用的最终解决方案。使用命名元组真的很有帮助。
import random
from math import sqrt
from collections import namedtuple
def stat(gen):
"""Returns the namedtuple Stat as below."""
Stat = namedtuple('Stat', 'total, sum, avg, sd, max, min')
it = iter(gen)
x0 = next(it)
mx = mn = s = x0
s2 = x0*x0
n = 1
for x in it:
mx = max(mx, x)
mn = min(mn, x)
s += x
s2 += x*x
n += 1
return Stat(n, s, s/n, sqrt(s2/n - s*s/n/n), mx, mn)
def random_int_list(size=100, start=0, end=1000):
return (random.randrange(start,end,1) for x in xrange(size))
if __name__ == '__main__':
r = stat(random_int_list())
print r #Stat(total=100, sum=56295, avg=562, sd=294.82537204250247, max=994, min=10)