如何在移动范围内总结列表中的元素

How to sum up elements in list in a moving range

我试图在移动范围内对列表中的元素求和。例如,当用户输入一个自定义范围'n'时,list[0]到list[n]会被累加存储在一个新的list中,接着是list[1]到list[n+1],直到结束。最后将打印出新列表中的最大数量。但是,在我的代码中,似乎元素是不断累加的。 非常感谢您的帮助。

列表是:

[5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2]

我的代码:

days = int(input('Enter customized range: '))
n = np.arange(days) 
total = 0
count = 1
max_total = []



while (count + len(n) - 2) <= (len(rain_b) - 1):

    for i in range(count+len(n)-4, count+len(n)-2):
        total += rain_c[i]
    #print(rain_b[count+number-1])
    #total = sum([(rain_c(count+number-4)) : (count+number-2)])
        max_total.append(total)
    count += 1
    print(max_total)

试试这个(lst 是你的列表,n 是你的范围):

print(max(sum(lst[i:i+n+1]) for i in range(len(lst)-n)))

例如:

>>> lst = [5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4]
>>> n = 5
>>> print([sum(lst[i:i+n+1]) for i in range(len(lst)-n)])
[21.5, 21.7, 38.9]
>>> print(max(sum(lst[i:i+n+1]) for i in range(len(lst)-n)))
38.9

由于您已经在使用 numpy,因此您可以将 np.convolve() 与长度为 n:

的数组一起使用
>>> n = 5
>>> x = np.arange(10)
>>> np.max(np.convolve(x, np.ones(n, dtype=x.dtype), mode="valid"))
35

这具有对数组 x 的每个 n 元素“window”执行 np.ones(n) 的点积的效果。 numpy.lib.stride_tricks 中的 sliding_window_view() 是类似的,有助于解释:

>>> x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> windows = np.lib.stride_tricks.sliding_window_view(x, n)
>>> windows
array([[0, 1, 2, 3, 4],
       [1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6],
       [3, 4, 5, 6, 7],
       [4, 5, 6, 7, 8],
       [5, 6, 7, 8, 9]])
>>> windows.sum(axis=1)
array([10, 15, 20, 25, 30, 35])
>>> np.convolve(x, np.ones(n, dtype=x.dtype), mode="valid")
array([10, 15, 20, 25, 30, 35])
  1. 我会清理您的循环条件,使其更加清晰和惯用。

  2. 我认为问题在于您没有将迭代之间的 总数 归零。

  3. 什么是rain_b和rain_c?应该只有 1 个输入列表和 1 个输出列表。

  4. 为什么不将 n 存储为整数而不是某个对象?我的电脑上没有 numpy,所以我只是删除了那部分。

这是我将如何执行此操作的伪代码:

For x in range 0 up to len(input_list) - n:
     window_total = 0
     for y in range x to x+n-1:
         window_total += input_list[y]
     output_list.append(window_total)

基于一个包含数字累加和的iterator/array,你可以通过减去后面n位的累加值得到n个值的滚动和。这种方法具有 O(N) 时间复杂度(与计算每个子范围的总和相反,即 O(N x W),其中 W 是滚动 window 大小)

没有 numpy:

L = [5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2]

n = 3

from itertools import accumulate

S = (a-b for a,b in zip(accumulate(L),accumulate([0]*n+L)))
print(max(S)) # 188.8

使用 numpy

import numpy as np

L = np.array([5.8, 1.2, 5.8, 1.0, 6.9, 0.8, 6.0, 18.4, 18.6, 1.0, 0.8, 6.4, 12.2, 18.2, 1.4, 6.8, 41.8, 3.6, 5.2, 5.2, 4.6, 8.6, 16.6, 13.2, 9.6, 41.6, 37.2, 110.0, 30.0, 34.8, 24.6, 7.0, 13.4, 0.5, 37.0, 18.8, 20.4, 0.6, 6.4, 2.4, 1.0, 7.6, 6.6, 4.4, 2.4, 0.6, 3.2, 21.2, 28.2, 3.2, 2.4, 14.4, 0.6, 1.6, 4.4, 0.8, 0.6, 1.6, 1.0, 27.0, 52.6, 10.2, 1.0, 4.2])

n = 3

S = np.cumsum(L)
S[n:] -= S[:-n]
print(np.max(S)) # 188.8