在Python中,当列表有正确索引时,我不断遇到“列表索引超出范围”错误

0 投票
3 回答
882 浏览
提问于 2025-04-16 23:48

我刚开始学习Python,遇到了一个列表索引错误,但我觉得不应该出现这个问题。

我有一个这样的变量:

date_array = ['2001','15','1']

我可以访问第一个索引。如果我尝试这样做:

date_array[-1] 

我就会得到“列表索引超出范围”的错误,每次尝试时都是这样:

date_array[2]
date_array[1] 

我把完整的代码附在下面,供你参考:

import csv
import datetime
import re
marketReader = csv.reader(open('test.csv', 'rb'))
i=0

for row in marketReader:
    cust_id = row[0]
    date = row[1]   # Is a text. Ex: '2002-1-1'
    spent = row[2] 

    date_array = (re.split('-',date)) # Provides an array ['2002', '1', '1']
    year = date_array[0]
    month = date_array[1]
    day = date_array[2]

    # Is weekday?
    weekday=datetime.date(year,month,day).weekday()

    if i==200 and row[0]>3 :
        break
    pass
    #print(day)
    i += 1

任何帮助都会非常感谢!这让我很烦恼!

3 个回答

0

如果你用的索引是正确的,Python就不会抱怨。如果它抱怨了,那就说明你用错了索引。就是这么简单。

现在你需要找出为什么列表太短了。你可以打印出这个数组,马上就能看到哪里出问题了。

0

你确定 date 里面是用连字符分隔的日期字符串吗?如果是这样的话,这段代码应该能正常运行:

>>> import re
>>> date_array = (re.split('-',date))
>>> date_array
['2002', '1', '1']
>>> date_array[0]
'2002'
>>> date_array[1]
'1'
>>> date_array[2]
'1'

也许你可以加上 print date 来确认一下 date 的值是不是你想的那样?另外,把错误信息也放在你的回答里会对我们有帮助。

2

简单来说,date_array这个列表不一定总是有3个元素。如果你直接访问这个列表的某个位置,记得先检查一下它的长度是否足够。

if len(date_array) < 3:
    print('date_array too short')
    # do something else

或者,你也可以把访问列表的操作放在一个try块里,这样可以避免错误。

撰写回答