迭代求和



我正在尝试编写一个python代码,它允许我迭代地求和列表中三个元素的平均值,从第三个元素和它的两个前元素开始。让我给你一个例子:

list = [1, 2, 3, 4, 5, 6, 7]

我想计算以下内容:

sum_of_average_values = sum(1, 2, 3)/3 + sum(2, 3, 4)/3 + sum(3, 4, 5)/3 + sum(4, 5, 6)/3 + sum(5, 6, 7)/3 

由于我对编程很陌生,我找不到一种有效的方法将其放入函数中。

你可以这样做:

a = [1,2,3,4,5,6,7]
sum_of_average_values = 0
for i in range(0,len(a)-2):
sum_of_average_values += sum(a[i:i+2])/3
print(sum_of_average_values)

从数学上讲,这可以通过平均3个子列表的和来获得:

L = [1, 2, 3, 4, 5, 6, 7]  
r = (sum(L) + sum(L[1:-1]) + sum(L[2:-2]))/3  # 20.0

,可以推广到w的窗口大小:

w = 3
r = sum(sum(L[p:-p or None]) for p in range(w)) / w

也可以通过使用项目位置来确定它们被添加到总数中的次数,而无需生成子列表的开销来实现:

r = sum(n*min(i+1,len(L)-i,w) for i,n in enumerate(L)) / w

这将是3种方法中最节省内存的方法,因为它使用迭代器将数据提供给sum函数,并且只遍历一次数据。

详细解释:

  • 由于所有的平均值加在一起是除以3,我们可以得到总和并在最后除以3
  • 第一个和最后一个位置的数字加一次
  • 第二个和倒数第二个位置的数字加两次
  • 从第三个位置到倒数第二个位置的数字加3次

视觉:

(1   + 2   + 3)                             / 3
(2   + 3   + 4)                       / 3
(3   + 4   + 5)                 / 3
(4   + 5   + 6)           / 3
(5   + 6   + 7)     / 3
(1x1 + 2x2 + 3x3 + 4x3 + 5x3 + 6x2 + 7x1)   / 3 = 20.0
n =  1   2   3   4   5   6   7   # value
* =  1   2   3   3   3   2   1   # multiplier (times added)
-------------------------
(2,  4,  9, 12, 15, 12,  7) / 3 = 20.0
i =  0   1   2   3   4   5   6   # index
1   2   3   3   3   2   1   # min(i+1,len(L)-i,w) = multiplier

您可以使用从pandas滚动。

import pandas as pd
num_list = [1, 2, 3, 4, 5, 6, 7]
average_sum = sum(pd.Series(num_list).rolling(3).mean().dropna())
print(average_sum)

实现这一点的方法有很多,其中一种方法是递归的。该函数对列表的最后三个元素求平均值,并将结果添加到缺少最后一个元素的列表的函数生成的结果中。继续这样做,直到列表小于3。

def fn(l):
if len(l) < 3: 
return 0
return sum(l[-3:])/3 + fn(l[:-1])
print(fn([1, 2, 3, 4, 5, 6, 7]))

另一种解决方案,您可以指定要求和和平均的元素数量:

l = [1, 2, 3, 4, 5, 6, 7]
def sum_avg(l, n):
res = 0
for i in range(n-1, len(l)):
res += sum([l[j] for j in range(i, i-n, -1)])/n

return res
print(sum_avg(l, 3))

——比;20.0

您可以在一行中使用列表推导式:

n = 3
avg = sum( [ sum(lst[i:i+n])/n for i in range(0, len(lst) - (n - 1)) ] )
print(avg) # 20.0

相关内容

  • 没有找到相关文章

最新更新