我试图对列表执行简单的移动平均值,其特殊性是列表的末尾是其自身的开始,但是,例如,使用 3 个样本从 1 到 9 的列表时,我尝试:
original_list = [*range(1,10)]
print(sum(original_list[-1:2])/3)
输出为 0.0,应为 (9+1+2)/3 = 4。
我的第一个猜测是我没有从索引中选择正确的值,所以我单独打印它们:
print(original_list[-1:], original_list[:2])
# Print:
# [9] [1, 2]
这符合预期,那么我之前的打印有什么问题吗?我该怎么办?
我尝试的是既分开又加入它们:
print(sum(original_list[-1:] + original_list[:2]) / 3)
# Print:
# 4
这是正确的值,但是如果我将样本增加到 5,然后我尝试:
import math
original_list = [*range(1,10)]
def MA(index):
to_be_averaged = original_list[-2 + index:] + original_list[:3 + index]
print(to_be_averaged)
print(sum(to_be_averaged) / len(to_be_averaged))
MA(0)
# Print
# [8, 9, 1, 2, 3]
# 4.6
MA(1)
# Print
# [9, 1, 2, 3, 4]
# 3.8
MA(2)
# Print
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5]
# 4.285714285714286
索引 2 真是一团糟,发生了什么事?我该怎么做呢?我觉得如果指数是正数或负数,这应该是一种独立获得从 a 到 b 范围的简单方法。
你是正确的,如果开始为负数,你想从原始列表中取出 2 个切片,但开始索引为正数,它从开头开始计算元素,这意味着
list[a:]
会从 a
到末尾获取元素。
只需说出两个条件即可。
original_list = [*range(1,10)]
start_index = -1
end_index = 2
if start_index < 0:
required_list = original_list[start_index:] + original_list[:end_index]
else:
required_list = original_list[start_index:end_index]
print(required_list)