Python 为什么生成器生成4个元素而不是6个元素
为什么函数移动平均会生成4个元素Python 为什么生成器生成4个元素而不是6个元素,python,python-2.7,generator,Python,Python 2.7,Generator,为什么函数移动平均会生成4个元素[40.0,42.0,45.0,43.0],而不是6个元素[36.66666 7,33.33333333,40.0,42.0,45.0,43.0] 我希望代码能够做到这一点: 首先,d是deque([40,30]),然后d.appendleft(0)makedeque([0,40,30]),因此s是70 在for循环中,第一个元素是40,因此s=s+elem-d.popleft()是s=70+40-0=110 然后d.append(elem)是deque([40
[40.0,42.0,45.0,43.0]
,而不是6个元素[36.66666 7,33.33333333,40.0,42.0,45.0,43.0]
我希望代码能够做到这一点:
- 首先,d是
,然后deque([40,30])
maked.appendleft(0)
,因此deque([0,40,30])
是70s
- 在
循环中,第一个元素是for
,因此40
是s=s+elem-d.popleft()
s=70+40-0=110
- 然后
是d.append(elem)
和deque([40,30,40])
s/float(3)=110/3.0=36.66666 7
依此类推。输入中只有4个三元组用于计算平均值:
n
保留为默认值时,它只会为每3个值生成一个平均值,而不会为部分窗口生成一个平均值
这些数字中的3个组合不会产生您的预期输出:
from collections import deque
def moving_average(iterable, n=3):
# moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
it = iter(iterable)
d = deque(itertools.islice(it, n-1))
d.appendleft(0)
s = sum(d)
for elem in it:
s += elem - d.popleft()
d.append(elem)
yield s / float(n)
a = [40, 30, 50, 46, 39, 44]
list(moving_average(a))
您似乎错过了
itertools.islice(it,n-1)
从iter(iterable)
迭代器中删除了前两个元素。前两个元素40
和30
不属于中元素的一部分:
用于循环,第一个elem
值为50
输入中只有4个三元组用于计算平均值:
n
保留为默认值时,它只会为每3个值生成一个平均值,而不会为部分窗口生成一个平均值
这些数字中的3个组合不会产生您的预期输出:
from collections import deque
def moving_average(iterable, n=3):
# moving_average([40, 30, 50, 46, 39, 44]) --> 40.0 42.0 45.0 43.0
it = iter(iterable)
d = deque(itertools.islice(it, n-1))
d.appendleft(0)
s = sum(d)
for elem in it:
s += elem - d.popleft()
d.append(elem)
yield s / float(n)
a = [40, 30, 50, 46, 39, 44]
list(moving_average(a))
您似乎错过了
itertools.islice(it,n-1)
从iter(iterable)
迭代器中删除了前两个元素。前两个元素40
和30
不是中元素的一部分:
用于循环,第一个elem
值是50
那么什么值,当和除以3时,产生36.6666666667和33.33333?首先,d是deque([40,30]),然后d.appendleft(0)是deque([0,40,30]),s是70,在for循环中,第一个元素是40,然后s=s+elem-d。popleft()是s=70+40-0=110,然后d.append(elem)是deque([40,30,40]),s/float(3)=110/3.0=36.666667。如此类推不,第一个元素是50
,而不是40
<代码>40
和30
从输入表中删除itertools.islice()
在it
上迭代。因此得到s=70+50-0=120
,并且d.append(elem)
生成deque([40,30,50])
。下一个elem
是46
。那么,当求和并除以3时,什么值会产生36.66666667和33.33333333?首先,d是deque([40,30]),然后d.appendleft(0)是deque([0,40,30]),s是70,在for循环中,第一个elem是40,然后s=s+elem-d.popleft()是s=70+40-0=110,然后d.appendleft(elem)是deque([40,30]),40,40]),浮点数(3)=110/3.0=36.6667。如此类推不,第一个元素是50
,而不是40
<代码>40
和30
从输入表中删除itertools.islice()
在it
上迭代。因此得到s=70+50-0=120
,并且d.append(elem)
生成deque([40,30,50])
。下一个elem
是46
why@littlely:因为它使用队列?它将前2个元素和0存储到队列中,创建一个和。然后在循环中,将下一个值(第3个)添加到总和中,减去队列中的第一个值(从0
开始,但在下一步中将是40
,以此类推),以使3个值的总和保持最新。这个队列只包含3个元素。但是这个函数实际上生成了一个滚动窗口,但我不知道why@littlely:因为它使用队列?它将前2个元素和0存储到队列中,创建一个和。然后在循环中,将下一个值(第3个)添加到总和中,减去队列中的第一个值(从0
开始,但在下一步中将是40
,以此类推),以使3个值的总和保持最新。队列仅包含3个元素。