【问题标题】:Having trouble resolving a 'list index out of range' error无法解决“列表索引超出范围”错误
【发布时间】:2015-04-27 22:32:09
【问题描述】:

我无法解决“列表索引超出范围”错误。该代码似乎运行良好,直到 file_no2 = line2.split()[0] 生成索引错误的某个点。该错误显示在正在读取的文件末尾之前的 70 行,因此我无法弄清楚为什么会出现“列表索引超出范围错误”。我试图遍历文件,直到 line2 被文件中的最后一行数据填充,因此我使用了 range 函数和先前计算的文件中行数的总和 (l)。我在范围计算中减去 1,目的是在 line1 被文件中倒数第二行填充后停止循环。但同样,索引错误是在距离文件末尾不到 70 行的地方停止进程,所以我不明白为什么它超出了范围。

for i in range(l-1):
    line1 = trackdata.readline()
    line2 = trackdata.readline()

    file_no1 = line1.split()[0]
    time1 = line1.split()[1]
    x1 = line1.split()[2]
    y1 = line1.split()[3]
    length1 = line1.split()[4]
    flow_dir1 = float(line1.split()[5])
    flow_mag1 = line1.split()[6]

    file_no2 = line2.split()[0]
    time2 = line2.split()[1]
    x2 = line2.split()[2]
    y2 = line2.split()[3]
    length2 = line2.split()[4]
    flow_dir2 = float(line2.split()[5])
    flow_mag2 = line2.split()[6]

    if file_no1 == file_no2:
        if abs(flow_dir2 - flow_dir1) > 90.0:
            print x1, y1
            #print >> coordinates2, x2, y2

这是一个结果示例:

185313.5426 112700.3316

1091 153.4636750 184498.3329 112815.9754 100.0000000 344.7592449 0.6516200005

184500.6344 112716.0019

1091 649.7940156 184461.4951 113012.3586 300.0000000 353.5487391 0.3463617710

1091 1599.736768 184398.7140 113126.0630 440.6196278 341.8759486 0.1121731124

1091 1734.946452 184382.9241 113119.2729 457.9156941 349.0664262 0.1303822198

...

1123 0.0000000000 184110.8309 113518.9487 0.0000000000 271.3035311 0.1646996924

以及错误信息:

Traceback(最近一次调用最后一次): 文件“O:\ArcGIS\courseypond\particletrack\check_trackangle_5yr”,第 28 行,在 > file_no2 = line2.split()[0] IndexError: 列表索引超出范围

输入数据是从包含 14910 行的以空格分隔的文本文件中读取的。每行数据的格式如上面的示例结果所示:文件编号、时间、x 坐标、y 坐标、长度、流向、流量大小。目的是识别并存储具有相同文件编号标识符的两条线的流向变化大于90度时的坐标点。

【问题讨论】:

  • 你能发布确切的错误和一些示例输入吗?如果可能,发布一个最小的示例(以便我们可以重现错误)将有很大帮助。难道是文件很糟糕?也许一行中只有 3 项,所以 line.split()[4] 失败。
  • 在错误前打印出line2
  • 如果file_no2 = line2.split()[0] 出现错误,那么我猜 line2 是空的。
  • @syntonym:我更新了讨论以包括错误消息的文本和输出结果的示例。输入文件包含 14910 行数据,并且错误发生在距离文件末尾不到 70 行的地方,所以我不确定仅使用最小的输入数据样本如何重现。生成错误的代码调用该行的第一项,该行始终存在于文件的最后一行。
  • @RPGillespie 如果我添加 print line2 命令,很明显循环会循环遍历文件直到倒数第二行(请参阅添加到问题讨论中的示例结果)。打印的最后 line2 是文件中倒数第二行,我猜这意味着文件的最后一行将没有 line2 与 line1 匹配。这让我觉得我需要在循环末尾添加一个语句,将新的 line1 等同于现有的 line2。也许我需要在循环外设置初始 line1 和 line2?

标签: python indexoutofboundsexception


【解决方案1】:

感谢您的建议。看来我设法通过将初始 line1 和 line2 分配重新定位到循环之外并在循环结束时将 line1 重新分配为等于 line2 来解决该问题。不再出现“列表索引超出范围错误”,并且文件中的每一行数据似乎都已配对以进行比较。更新后的代码如下:

line1 = trackdata.readline()
line2 = trackdata.readline()

for i in range(l-1):

    file_no1 = line1.split()[0]
    time1 = line1.split()[1]
    x1 = line1.split()[2]
    y1 = line1.split()[3]
    length1 = line1.split()[4]
    flow_dir1 = float(line1.split()[5])
    flow_mag1 = line1.split()[6]

    file_no2 = line2.split()[0]
    time2 = line2.split()[1]
    x2 = line2.split()[2]
    y2 = line2.split()[3]
    length2 = line2.split()[4]
    flow_dir2 = float(line2.split()[5])
    flow_mag2 = line2.split()[6]

    if file_no1 == file_no2:
        if abs(flow_dir2 - flow_dir1) > 90.0:
            print x1, y1
            #print >> coordinates2, x2, y2

    line1 = line2
    line2 = trackdata.readline()

【讨论】:

  • 很好,您可以解决您的问题!如果您愿意,这里有一些提示可以让您的解决方案“更加 Pythonic”:您可以在一行中完成所有作业,例如在 this 问题中。它看起来像下面这样:file_no1, time1, x1, y1, length1, flow_dir1, flow_mag1 = line1.split() 虽然这不涉及将flow_dir1 转换为浮点数。 This 可以替换你的 for 循环。字符用完了,如果想了解更多,请询问。
  • @syntonym 谢谢。精简代码并不是很重要,因为这只是达到目的的一种手段。我想我可以在绝对值计算中将 flow_dir 转换为浮点数。不过,据我所知,我仍然需要逐行遍历文件以比较数据。我只知道如何使用循环结构来做到这一点。不过,现在,我有我需要的东西。
猜你喜欢
  • 2022-01-20
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
相关资源
最近更新 更多