我有以下代码打开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
答案 0 :(得分:1)
为什么会得到IndexError
?因为当您撰写lst[k:k+1] = ''
时,您刚刚从列表中删除了k+1
元素,表示1
元素缩短了您的列表,并且您的循环仍然是旧的len(lst)
,因此索引变量k
可以保证过去。
你怎么解决这个问题?循环复制并使用list.remove()
从原文中删除。
以下代码循环遍历副本。
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
运行您的程序,在脚本中止时,检查lst
,k
,lst[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']