2013-10-01 38 views
-2

我在這裏找不到我的錯誤,如果有人可以幫助我會很好。TypeError:列表索引必須是整數,而不是在堆中浮動

def heapsort (lista) : 
    n= len(lista)-1 
    k= n/2 
    while (k>0) : 
     downheap(lista,n,k) 
     k-=1 
    while (n>=0) : 
     (lista[1]),(lista[n])=(lista[n]),(lista[1]) 
     n-=1 
     return downheap(lista, n, 1) 
    return lista 

def downheap (lista, n, k) : 
    v= lista[k] 
    while (k<=(n/2)) : 
     j=k+k 
     if (j<n and (lista[j]) == (lista[j])) : 
      break 
     (lista[k]) = (lista[j]) 
     k = j 
    lista[k] = v 

錯誤:

>>> heapsort([4,2,3,1]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in heapsort 
    File "<stdin>", line 2, in downheap 
TypeError: list indices must be integers, not float 
+1

這是Python 3的吧? Python錯誤帶有完整的追溯功能,當您詢問有關Python問題的時候,請包括這些錯誤。 –

+0

我們將如何去重現您的錯誤?你如何調用'heapsort()',以便觸發異常? –

+0

我能猜到,*這次*。但是對於未來的問題,請包括一小段代碼,讓我們重現您的問題。 –

回答

5

在Python 3,使用/除法運算總是返回float

>>> 2/2 
1.0 
>>> 3/2 
1.5 

使用地板師相反,//操作:

k = n // 2 

//操作總是返回一個整數,地板結果:

>>> 2//2 
1 
>>> 3//2 
1 

也許你在Python 2爲例編碼的功能;在Python 2中,/運算符是一個模糊的運算符;當兩個操作數都是整數時,它的作用就像是分區運算符,但是如果其中一個操作數是一個浮點數,那麼它突然表現不同,並返回浮點除法結果,而不是。因爲代碼中的兩個操作數都是整數,所以在Python 2中,代碼不會拋出異常。

您的下一個問題是downheap()不會返回任何內容,因此當您在heapsort()中使用return downheap(lista, n, 1)時,您將返回None。我懷疑return有一個錯誤。

0

●拆分只是強制轉換爲int

def heapsort (lista) : 
    n= len(lista)-1 
    k= int(n/2)      // instead of k= n/2 
    while (k>0) : 
     downheap(lista,n,k) 
     k-=1 
    while (n>=0) : 
     (lista[1]),(lista[n])=(lista[n]),(lista[1]) 
     n-=1 
     return downheap(lista, n, 1) 
    return lista 
相關問題