旧版本的Python文档中有一个很棒的滑动窗口生成器,并带有
itertools示例:
from itertools import islicedef window(seq, n=2): "Returns a sliding window (of width n) over data from the iterable" " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ... " it = iter(seq) result = tuple(islice(it, n)) if len(result) == n: yield result for elem in it: result = result[1:] + (elem,) yield result
使用您的移动平均线是微不足道的:
from __future__ import division # For Python 2def moving_averages(values, size): for selection in window(values, size): yield sum(selection) / size
对您的输入运行(将字符串映射为整数)可以得到:
>>> y= ['1', '2', '3', '4','5','6','7','8','9','10']>>> for avg in moving_averages(map(int, y), 5):... print(avg)... 3.04.05.06.07.08.0
要返回“不完整”集
None的第
n - 1一次迭代,只需将
moving_averages函数扩展一点:
def moving_averages(values, size): for _ in range(size - 1): yield None for selection in window(values, size): yield sum(selection) / size



