为什么这会给我一个IndexError



我有以下代码,它打开一个csv,并将所有值附加到列表中。然后,我删除所有不以'2'开头的值。然而,在线路if lst[k][0] != '2':上,它引发了一个错误:

Traceback (most recent call last):
  File "historical_tempo1.py", line 23, in <module>
    if lst[k][0] != '2':
IndexError: list index out of range

这是代码:

y = open('today.csv')
lst = []
for k in y:
        lst.append(k)
lst = ' '.join(lst).split()
for k in range(0, len(lst)-1):
        if lst[k][0] != '2':
                lst[k:k+1] = ''

以下是csv文件中的第一位内容:

Date,Time,PM2.5 Mass concentration(ug/m3),Status
3/15/2014,4:49:13 PM,START
2014/03/15,16:49,0.5,0
3/15/2014,4:49:45 PM,START
2014/03/15,16:50,5.3,0
2014/03/15,16:51,5.1,0
2014/03/15,16:52,5.0,0
2014/03/15,16:53,5.0,0
2014/03/15,16:54,5.4,0
2014/03/15,16:55,6.4,0
2014/03/15,16:56,6.4,0
2014/03/15,16:57,5.0,0
2014/03/15,16:58,5.2,0
2014/03/15,16:59,5.2,0
3/15/2014,5:03:48 PM,START
2014/03/15,17:04,4.8,0
2014/03/15,17:05,4.9,0
2014/03/15,17:06,4.9,0
2014/03/15,17:07,5.1,0
2014/03/15,17:08,4.6,0
2014/03/15,17:09,4.9,0
2014/03/15,17:10,4.4,0
2014/03/15,17:11,5.7,0
2014/03/15,17:12,4.4,0
2014/03/15,17:13,4.0,0
2014/03/15,17:14,4.6,0
2014/03/15,17:15,4.7,0
2014/03/15,17:16,4.8,0
2014/03/15,17:17,4.5,0
2014/03/15,17:18,4.4,0
2014/03/15,17:19,4.5,0
2014/03/15,17:20,4.8,0
2014/03/15,17:21,4.6,0
2014/03/15,17:22,5.1,0
2014/03/15,17:23,4.2,0
2014/03/15,17:24,4.6,0
2014/03/15,17:25,4.5,0
2014/03/15,17:26,4.4,0
  1. 为什么要获得IndexError因为在编写lst[k:k+1] = ''时,您刚刚从列表中删除了k+1元素,这意味着您的列表比1元素短,并且您的循环仍在向上到旧的len(lst),所以索引变量k保证会继续。

  2. 你怎么能解决这个问题?使用list.remove()循环复制副本并从原始副本中删除。

以下代码在副本上循环。

for s in lst[:]:
     if k[0] != '2':
         list.remove(k)

表达式lst[k][0]引发一个IndexError,这意味着:

# (1) this expressions raises it
x = lst[k]
# or (2) this expression raises it
x[0]

如果(1)提出它,则表示len(lst) <= k,即项目比您预期的要少。

如果(2)引发它,则意味着x是一个空字符串,这意味着您不能访问其索引0处的项。


无论哪种方式,都可以使用pdb,而不是猜测。使用pdb运行程序,在脚本中止时,检查lstklst[k]lst[k][0]的值。

基本上,您的列表"lst"的起始长度为43。"slice"操作lst[k:k+1]不会用"替换两个单独的索引值,而是删除其中一个列表条目。如果你做了一个lst[k:k+5],你会删掉五个条目。在口译员那里试试。

我建议你不要试图删除那些条目,尤其是在你正在执行操作的列表中。在这种情况下,它正在缩小,这意味着你超出了范围,得到了一个"IndexError"。如果必须删除不以"2"开头的行,请将所需值存储到另一个列表中。

列表理解在这种情况下效果很好。。。

mynewlist = [x for x in lst if x[0] == '2']

最新更新