![](/img/trans.png)
[英]Why does increasing a variable by a list element give me an IndexError?
[英]Why does this give me an 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
為什么會出現IndexError
? 因為當您編寫lst[k:k+1] = ''
,您剛剛從列表中刪除了k+1
元素,這意味着您的列表短了1
元素,並且循環仍舊沿舊len(lst)
,因此保證索引變量k
可以通過。
您該如何解決? 循環復制並使用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
運行程序,然后腳本中止,請檢查lst
, k
, lst[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']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.