2012-08-25 36 views
-1

這是我的合併排序Python代碼,我無法理解爲什麼我在第23行獲得IndexError索引錯誤:Python代碼中的列表索引超出範圍

如果放在for循環之前,第23行沒有給出錯誤,但是在for循環中它表示list index out of range。 :(

from math import floor 

def merge_sort(a,p,r): 
if p < r: 
    q = (p+r)/2 
    merge_sort(a,p,q) 
    merge_sort(a,q+1,r) 
    merge(a,p,q,r) 

def merge(A,p,q,r): 
n1 = q - r +1 
n2 = r - q 
L = [] 
R = [] 
#print n1 
for i in range (1,n1): 
    L.append(a[p+i-1]) 
for j in range (1,n2): 
    R.append(a[q+j]) 
L.append(10000) 
R.append(10000) 
i,j=0,0 

for k in range (p,r): 
    if L[i] <= R [j]: # This is where the error occurs 
    A[k] = L[i] 
    i = i + 1 
    else : 
    A[k] = R[j] 
    j = j + 1 



a=[1,4,9,8,2,3,8,2,9] 
merge_sort(a,1,len(a)) 
print a 
+4

哪一行是23行?你可以用評論來表明它嗎? –

+3

你的縮進被搞砸了,你應該使用四個空格來縮進。 –

+0

爲什麼你需要'L.append(10000)'操作? –

回答

0

這不是蟒蛇,這是帕斯卡Python語法

這是實現合併排序算法中的(基於Merge sort wiki article):

def merge_sort(data): 
    if len(data) <= 1: 
     return data 

    middle = len(data)/2 

    left = merge_sort(data[0:middle]) 
    right = merge_sort(data[middle:]) 

    return merge(left, right) 


def merge(left, right): 
    result = [] 

    while left or right: 
     if left and right: 
      if left[0] <= right[0]: 
       result.append(left.pop(0)) 
       continue 

      result.append(right.pop(0)) 
      continue 

     if left: 
      result.append(left.pop(0)) 
     elif right: 
      result.append(right.pop(0)) 

    return result 


data = [1, 4, 9, 8, 2, 3, 8, 2, 9] 
result = merge_sort(data) 

assert len(data) == len(result) 

print result 
0

我提意見一致/其他海報,這個腳本有一個Python語法(除了不是習慣上的4個空格的縮進...),而是來自Pythonic的遠的 ...

無論如何,對於你的問題:它看起來像問題出現在merge(p,q,r)=(1,2,3)。在這種情況下,n1=0n2=1。在range(1,n1)上循環將不會給你任何東西,因此你的L將只有1個元素(10000你追加到循環之外)。

現在,當你到達for k in range (p,r)循環:

  • 在第一次循環,k=p=1L[0] <= R[0]並添加1i,所以i = 1
  • 在第二次迭代,您嘗試訪問L[i],即L[1],這是未定義的。因此,IndexError

幾個建議:

  • 瞭解如何使用調試器。很多IDE都帶有一些實現,它確實有幫助。
  • 請記住,列表以索引0開始。當您來自另一種語言時,您往往會忘記它。