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

问题描述:

我是一个Python初学者,我确实明白在这种情况下有什么不对,SetVel[i+4]超出了范围。但我无法纠正它。任何帮助将是惊人的。这里是我的代码:如何删除for循环的'索引超出范围'错误?

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后病情一道努力消除错误,但代码只有一次运行该块。只有一个指数附加

+1

您的range()转到了'length-3',所以'i + 4'会超出'SetVel'的长度。 – AChampion

+0

是的,我明白错误的原因,所以解决方案将它限制为[i]而不是集合中增加的元素? –

+0

现在的问题是,它只打印一个元素作为答案,因为休息,这绝对不是真的 –

您正在使用i,只是length-3之前马克塞斯,在length-4(这INFACT等于len(SetVel)-4迭代。

按照这样的逻辑,如果i = len(SetVel)-4然后SetVel[i+4]等于SetVel[len(SetVel)-4+4],或SetVel[len(SetVel)]

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

换句话说,更换

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

随着

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

最后,如果你break循环在它的结束,无条件的,你得到它只有一个迭代(只有一个结果),所以只是不这样做

高度规则的数学表达式可能更清晰,索引结果而不是命名变量
和Pytho ñ真的喜欢消费的迭代器

,一旦你用来列出内涵,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)])] 
+0

哇..这很有道理!谢谢! –

+0

upvotes是首选的Stack Exchange反馈,即使它不直接回答你的问题,请记住当你有15个声望点时 – f5r5e5d