如何删除for循环的“索引超出范围”错误?

2024-06-16 08:45:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Python的初学者,我知道在这种情况下,SetVel[i+4]超出了范围。但我无法集中精力纠正它。任何帮助都将是惊人的。我的代码是:

OutSmooth = []
IndexOut = []
IndSmooth = []
length = len(SetVel)
for i in range(2, length-3):
    diffnext = (SetVel[i+4])- (SetVel[i+3])
    diffprev = (SetVel[i+1])-(SetVel[i])
    diff1 = SetVel[i+2]-SetVel[i+1]
    diff2 = SetVel[i+3]-SetVel[i+2]
    if diff1 < 1.5*diffprev or diff2 < 1.5*diffnext:
        IndSmooth.append(SetVel.index(SetVel[i+2]))
    else:
        OutSmooth.append(SetVel[i+2])

PS:对于那些问这到底是什么的人:这是我在非导数曲线平滑的尝试。在我的主程序中,我有一个基于NumPy的导数曲线平滑机制,但我这样做是为了我的理解和作为备份。谢谢

编辑:

break条件工作后删除错误,但代码只运行该块一次。只追加一个索引


Tags: 代码情况length曲线导数初学者append集中精力
2条回答

使用索引结果而不是命名变量,高度正则的数学表达式可能更清晰
Python非常喜欢使用迭代器

一旦您习惯了列出理解,zip()我认为生成一个diff列表可能会更清楚

SetVel = [math.sin(math.pi*(n % 10 - 5)/5) for n in range(20)]

diffs = [[ e1 - e0, e2 - e1, e3 - e2, e4 - e3 ]
         for e0, e1, e2, e3, e4
             in zip(SetVel,
                    SetVel[1:],
                    SetVel[2:],
                    SetVel[3:],
                    SetVel[4:])]

OutSmooth = []
IndSmooth = []
delta = 1.5    # may want to change the constant, do it one place

for i, d in enumerate(diffs):
if d[1] < delta*d[0] or d[2] < delta*d[3]:
        IndSmooth.append(i+2) # a guess at what you really wanted
    else:
        OutSmooth.append(SetVel[i+2])

IndSmooth
Out[64]: [2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17]

OutSmooth
Out[65]: [0.0, 0.0]

一个常见的编程目标是参数化、自动化,所以这里的输入是您想要的差异数,其余的是自动的

^{pr2}$

您正在使用i进行迭代,它在length-3之前最大化,在length-4(实际上等于len(SetVel)-4)。在

按照这个逻辑,如果i = len(SetVel)-4,那么SetVel[i+4]等于SetVel[len(SetVel)-4+4],或者{}。在

所有这些只是为了告诉您错误的原因-您正在寻找一个长度本身的索引。这不太好,因为索引从0开始,而不是1。可能的最高索引是长度的-1。在

换言之,替换

for i in range(2, length-3):

^{pr2}$

最后,如果您break循环结束时,无条件地,您只能得到它的一次迭代(只有一个结果),所以不要这样做

相关问题 更多 >