繁体   English   中英

IndexError:索引超出范围

[英]IndexError: index out of range

我有一个循环可以运行16次,因为它读取的文件中有16行,因此我正在使用一个循环来读取时间戳的前两个字符。 但是我无法弄清楚如何使n变量不达到17。我试图使用while条件将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

问题是您要遍历两个相同长度的dotsdotstime_stamp 但是,您正在按time_stamp顺序向前看,同时访问当前项和下一项以计算wait_time值。 这是由于循环的最后一个遍历导致您的IndexError ,因为n+1索引指向列表的末尾。

有几种不同的方法可以解决此问题。 您可以修改数据结构,以使dots少一个元素,或者使time_stamp数多一个。 或者,您也可以按照注释中的建议简单地循环一小段时间。

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

这是一些执行此操作的代码。 特殊情况是最后一次通过,其中n等于len(time_stamp)-1 ,在这种情况下,只需将wait_time设置为零。 请注意,我是通过for循环中的内置enumerate函数生成n的,因此不需要将其初始化为零或手动更新:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM