簡體   English   中英

為什么這會給我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
  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']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM