如何删除for循环的'index out of range'错误?

时间:2017-07-30 19:24:54

标签: python for-loop indexing smoothing index-error

我是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,但代码仅运行块一次。只附加一个索引

2 个答案:

答案 0 :(得分:1)

您正在使用i进行迭代,length-3位于length-4之前,len(SetVel)-4(实际上等于i = len(SetVel)-4

遵循此逻辑,如果SetVel[i+4],则SetVel[len(SetVel)-4+4]等于SetVel[len(SetVel)]for i in range(2, length-3):

所有这一切只是为了向您展示错误的原因 - 您正在寻找一个长度本身的索引。这不会很好,因为索引从0开始而不是1.可能的最高索引是从长度开始的-1。

换句话说,替换

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

使用

break

最后,如果你<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.designer.cs" Inherits="HelloWorlds.WebForm1" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:TextBox ID="item1" runat="server"> </asp:TextBox> </div> </form> </body> </html> 循环结束,无条件地,你只得到它的一次迭代(只有一个结果),所以不要那样做

答案 1 :(得分:0)

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

一旦习惯列出理解,zip()我认为生成差异列表可能更清楚

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]

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

n_diff = 4

diffs = [[g - f for f, g in zip(e, e[1:])]
                for e in zip(*[SetVel[n:]
                               for n in range(n_diff+1)])]