IndexError:索引超出范围

时间:2012-12-24 23:03:44

标签: python

我有一个运行16次的循环,因为它读取的文件中有16行,我正在使用循环来读取时间戳的前两个字符。但我无法弄清楚如何保持n变量达到17.我试图使用条件将n限制为16但无济于事。这是我的整个功能,我正试图在http://calicoproject.org/Calico_Python_GIS详细描述飓风艾琳的路径:

def drawIrene(win):
line = Line()
n = 0
for (x,y) in dots:
    time_stamp[n] = time_stamp[n][:2]
    time_stamp[n+1] = time_stamp[n+1][:2]
    time1 = abs(int(time_stamp[n]) - 12)
    time2 = abs(int(time_stamp[n+1]) - 12)
    wait_time = abs(int(time1) - int(time2))
    x, y = ll2xy(x, y)
    c = Circle(Point(x, y), int(eye_size[n]))
    line.append(Point(x,y))
    c.fill = Color(255, 255, 0, 62)
    c.draw(win)
    t = Polygon((x, y), (x+10, y+5), (x+int(movement_speed[n]), y-int(movement_speed[n])/2))
    t.fill = Color("orange")
    t.draw(win)
    print(time1)
    print(time2)
    print()
    #print (wait_time)
    wait(wait_time)
    if n < len(dots):
        n += 1
    else:
        break
line.draw(win)
line.border = 2

1 个答案:

答案 0 :(得分:1)

问题是您要循环两个长度相同的序列dotstime_stamp。但是,您在time_stamp序列中向前看,访问当前项和下一项以计算wait_time值。这导致您的IndexError在最后一次循环中通过循环,因为n+1索引指向列表的末尾。

有几种不同的方法可以解决这个问题。您可以修改数据结构,以便dots只有一个元素,或者time_stamp还有一个元素。或者你可以简单地循环一次,如评论中所建议的那样。

但我认为最好的解决方案是更改循环中的逻辑,以便在第一个或最后一个循环中以不同方式计算wait_time。例如,您可能选择在最后一个周期没有延迟。

这里有一些代码可以做到这一点。特殊情况是最后一次传递,其中n等于len(time_stamp)-1,并且在这种情况下简单地将wait_time设置为零。请注意,我正在n循环中的内置enumerate函数生成for,因此无需将其初始化为零或手动更新:

for n, (x, y) in enumerate(dots):
    if n < len(time_stamp)-1:
        time_stamp[n] = time_stamp[n][:2]
        time_stamp[n+1] = time_stamp[n+1][:2]
        time1 = abs(int(time_stamp[n]) - 12)
        time2 = abs(int(time_stamp[n+1]) - 12)
        wait_time = abs(int(time1) - int(time2))
    else: # special case n >= len(time_stamp)-1, which should be the last pass
        wait_time = 0
    x, y = ll2xy(x, y)
    c = Circle(Point(x, y), int(eye_size[n]))
    line.append(Point(x,y))
    c.fill = Color(255, 255, 0, 62)
    c.draw(win)
    t = Polygon((x, y), (x+10, y+5),
                (x+int(movement_speed[n]), y-int(movement_speed[n])/2))
    t.fill = Color("orange")
    t.draw(win)
    wait(wait_time)