迭代求和

如何解决迭代求和

我正在尝试编写一个 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?