【问题标题】:Python - Getting a for loop error: IndexError: list index out of rangePython - 获取 for 循环错误:IndexError:列表索引超出范围
【发布时间】:2020-09-07 10:49:53
【问题描述】:

我被一段代码卡住了,我似乎找不到解决错误的答案

我不断收到以下错误消息,但没有意义:

temp = times[i].split(', ')
IndexError: list index out of range

作为上下文,我正在抓取一个网站以获取有关登录日期和时间的信息,它检索登录日期和时间的文本版本,因此我正在转换时间到一个日期时间对象中,这样我就可以减去另一个日期时间对象并找出这个人是否迟到

我的第一步是用逗号(,)分隔日期和时间(都是一个字符串),然后将时间转换成一个日期时间对象,并在最后添加一个if语句来确认是否登录时间

如果我要删除 IF 语句,错误就会消失,这有点奇怪,如果我要将列表减少一个,它也会消失

from datetime import datetime, date

times  = ['5/1/2020, 8:08:54', '5/1/2020, 10:07:09', '5/1/2020, 10:27:49', '5/1/2020, 10:53:14',
'5/1/2020, 11:57:46', '5/1/2020, 12:53:38', '5/1/2020, 2:04:52', '5/1/2020, 2:14:55']

#Analysts Shift
schedule = datetime.strptime('8:05:00', '%H:%M:%S').time()

for i in range(len(times)):
    temp = times[i].split(', ')
    a = datetime.strptime(temp[1], '%H:%M:%S').time()
    if datetime.combine(date.today(), a) < datetime.combine(date.today(), schedule):
        times.pop(i)

print(times)

【问题讨论】:

  • times.pop(i) 您在迭代列表时会破坏性地改变列表,这通常是个坏主意。 range(len(times)) 设置了一个 range 对象,其长度是原始列表的长度,但是您正在使该列表在循环中变得更小,因此 i 最终超过了变异列表的长度。
  • 我想我最终会创建一个新列表,它不会给我错误消息,我会用 newlist.append(times[i]) 或类似的替换 times.pop()
  • 这肯定更惯用。

标签: python list loops for-loop indexing


【解决方案1】:

将你的 for 循环更改为:

for i in range(len(times)-1):

【讨论】:

  • 这有什么帮助?如果在循环过程中有超过 1 个pop(),也会发生同样的错误。
  • 哦,我现在明白了。好吧,唯一的解决方案是创建一个新列表,并将所需的值存储在其中。而不是从我们迭代的列表中删除错误的。
  • 这可能不是唯一的方式,但它是惯用的方式。
猜你喜欢
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2020-01-28
  • 2019-05-21
  • 2018-04-22
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多