2012-02-12 150 views
0

這是那些尷尬的代碼片段之一,只需要第二雙眼睛來發現「明顯」的錯誤。我正在處理一個列表清單,出於某種原因,我打了一個'列表索引超出範圍'erorr - 儘管在屏幕上觀看了一段時間,但我無法發現它。簡單列表處理函數中的IndexError - 我錯過了什麼?

下面是摘錄:

def group_ldata(data, freq, normal_grouping = True): 
    if freq > 1 and len(data) > (SOME_SANITY_FACTOR*freq): 
     i, output, subset, lastpos = (0, [],[], len(data)-freq) 
     if not normal_grouping: 
      for i in range(lastpos): 
       pass 
     else: 
      while True: 
       subset = data[i:freq] 
       #print subset 
       firstrow = subset[0] 
       lastrow = subset[-1] 
       output.append((firstrow[0], firstrow[1], lastrow[2])) 
       i += freq 
       if i >= lastpos: 
        break 
     return output 
    else: 
     return data 

下面是一些樣本數據來引導:

>>> a =[] 
>>> a.append(range(0,5)) 
>>> a.append(range(5,10)) 
>>> a.append(range(10,15)) 
>>> a.append(range(15,20)) 
>>> a.append(range(20,25)) 
>>> a.append(range(25,30)) 
>>> a.append(range(30,35)) 

這是當我運行它的結果:

>>> b = group_ldata(a,2) 
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]] 
[] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 11, in group_ldata 
IndexError: list index out of range 

任何人都可以找出什麼是造成錯誤?

回答

2

我不確定你在做什麼。但是,錯誤的原因很明顯。

在開始的時候,你做i=0。 然後,在while True循環後面,你做i += freq。所以,現在我equals頻率。

現在,當while True循環再次運行(第2次迭代)時,在行subset = data[i:freq]中,子集將等於一個長度爲0的列表。並且您試圖訪問該列表的第一個元素。說得通?

+0

賓果!我知道這將是一件愚蠢的事 - 很好的發現!上限應該是i + freq。 – 2012-02-12 14:29:13