Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 迭代求和_Python_List_Sum_Iteration - Fatal编程技术网

Python 迭代求和

Python 迭代求和,python,list,sum,iteration,Python,List,Sum,Iteration,我正在尝试编写一个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 因为我是编程新手,所以我找不到一种有效的方法将其应用到函数中。您可以这样做

我正在尝试编写一个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)

您可以这样做:

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, 2, 3, 4, 5, 6, 7]))
def fn(l):
如果len(l)<3:
返回0
返回和(l[-3:])/3+fn(l[:-1])
打印(fn([1,2,3,4,5,6,7]))

实现这一点的方法很多,其中一种是递归。 函数对列表的最后三个元素求平均值,并将结果添加到缺少最后一个元素的列表中的函数生成的结果中。继续此操作,直到列表短于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]))
def fn(l):
如果len(l)<3:
返回0
返回和(l[-3:])/3+fn(l[:-1])
打印(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

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

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

您可以使用熊猫

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)
你可以从熊猫身上得到些什么

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)

您可以使用列表理解在一行中执行以下操作:

n = 3
avg = sum( [ sum(lst[i:i+n])/n for i in range(0, len(lst) - (n - 1)) ] )
print(avg) # 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

从数学上讲,这可以通过平均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
这是三种方法中内存效率最高的一种,因为它使用迭代器向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

从数学上讲,这可以通过平均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
这是三种方法中内存效率最高的一种,因为它使用迭代器向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