如何解决迭代求和
我正在尝试编写一个 python 代码,它允许我迭代地总结列表中三个元素的平均值,从第三个元素及其两个前辈开始。我给你举个例子:
list = [1,2,3,4,5,6,7]
我想计算以下内容:
sum_of_average_values = sum(1,3)/3 + sum(2,4)/3 + sum(3,5)/3 + sum(4,6)/3 + sum(5,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。
def fn(l):
if len(l) < 3:
return 0
return sum(l[-3:])/3 + fn(l[:-1])
print(fn([1,7]))
,
另一种解决方案,您可以在其中指定要汇总和平均的元素数量:
l = [1,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
,您可以使用 pandas 中的 rolling。
import pandas as pd
num_list = [1,7]
average_sum = sum(pd.Series(num_list).rolling(3).mean().dropna())
print(average_sum)
,
在数学上,这可以通过平均 3 个子列表的总和来获得:
L = [1,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,9,12,15,7) / 3 = 20.0
i = 0 1 2 3 4 5 6 # index
1 2 3 3 3 2 1 # min(i+1,w) = multiplier
,
您可以使用列表理解在一行中完成:
n = 3
avg = sum( [ sum(lst[i:i+n])/n for i in range(0,len(lst) - (n - 1)) ] )
print(avg) # 20.0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。