列表索引必须是整数或切片,而不是NoneType

时间:2019-02-08 13:46:24

标签: python

当我尝试自行创建快速排序时,我正在处理此问题 我不知道该如何解决该错误,而且我当然也不确定我的代码中是否存在其他任何问题。

def Qsort(list):
    if len(list) < 2:
        return list
    Qsorthelper(list, 0, len(list)-1)

def Qsorthelper(list, first, last):
    if last>first:
        split=partition(list, first, last)
        Qsorthelper(list, first, split-1)
        Qsorthelper(list, split+1, last)

def median(list):
    if len(list) %2 == 0:
        return (len(list)//2+len(list)//2-1)/2
    else:
        return len(list)//2

def finditem(list, num):
    for i in range(0,len(list)-1):
        if num == list[i]:
            return i


def choosepivot(list):
    if list[0] > list[len(list)-1] > list[median(list)] or list[0] < 
    list[len(list)-1] < list[median(list)]:
        return list[len(list)-1]
    elif list[len(list)-1] > list[0] > list[median(list)] or 
    list[len(list)-1] < list[0] < list[median(list)]:
        return list[0]
    else:
        return list[median(list)]



def partition(list, first, last):
    pivot = choosepivot(list)
    list.append(pivot)
    list.remove(pivot)
    left = list[first]
    right = list[last-1]
    done = False

    while not done:
        while left <= right and list[left] <= pivot:
            left = left + 1

        while right >= left and list[right] >= pivot:
            right = right - 1

        if right < left:
            done = True
        else:
            temp = list[left]
            list[left] = list[right]
            list[right] = temp

    temp = list[finditem(list,pivot)]
    list[finditem(list,pivot)] = list[right]
    list[right] = temp

    return right

alist = [54,26,93,17,77,31,44,55,20]
Qsort(alist)
print(alist)

我不知道是什么原因导致了错误,但我真的想修复它 有任何建议或答案吗?

编辑: 我更改了finditem部分,以修复找不到最后一个元素的问题:

def finditem(alist, num):
    for i in range(0,len(alist)):
        if num == alist[i]:
            return i

我收到此错误:

File "C:\Users\user\Desktop\ITB\failed quick sort.py", line 59, in partition
    alist[finditem(alist,pivot)] = alist[right]
IndexError: list index out of range
>>> 

temp = list[finditem(list,pivot)]
list[finditem(list,pivot)] = list[right]
list[right] = temp

这部分是我用枢轴切换最终项目以完成一个周期的部分,这里有些错误,但我想知道如何做。

1 个答案:

答案 0 :(得分:1)

导致上述错误的代码在您的finditem函数中,该函数在最后一个元素之前停止。如果您要查找的项目恰好是最后一个元素,则返回None,并将其用作list的索引(您不应使用list作为变量名,因为它具有python中的另一个意思)。

这不是唯一的问题。 median函数还可以返回浮点数,因此,即使大小大小的列表,使用它进行索引的任何操作(例如list[median(list)])都可能失败。

还有其他错误。我建议您分别测试每个功能,并建议您参考一些现有的实现方式。