为什么这会给我一个IndexError?

时间:2014-04-13 05:37:22

标签: python python-2.7 csv

我有以下代码打开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

3 个答案:

答案 0 :(得分:1)

  1. 为什么会得到IndexError因为当您撰写lst[k:k+1] = ''时,您刚刚从列表中删除了k+1元素,表示1元素缩短了您的列表,并且您的循环仍然是旧的len(lst),因此索引变量k可以保证过去。

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

  3. 以下代码循环遍历副本。

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

答案 1 :(得分:0)

表达式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]的值。

答案 2 :(得分:0)

基本上,你的列表'lst'从43开始。'slice'操作lst [k:k + 1]不会用''替换两个单独的索引值,但会清除其中一个列表条目。如果你做了一个[k:k + 5],你会消灭五个条目。在口译员中尝试一下。

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

列表理解在这种情况下很有用......

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