TypeError:list indices必须是整数,而不是heapsort中的float

时间:2013-10-01 07:03:58

标签: python

我在这里找不到我的错误,如果有人可以帮助我会很棒。

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

2 个答案:

答案 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()没有返回任何内容,因此当您在return downheap(lista, n, 1)中使用heapsort()时,您将返回None。我怀疑return有错误。

答案 1 :(得分: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