在Python中实现快速排序时存在差异



以下是我在Python中实现的快速排序:

def quicksort(alist):
if len(alist) <= 1:
return alist
else:
pivot = alist[len(alist)//2]
alist.remove(pivot)
alist1, alist2 = partition(alist, pivot)
return quicksort(alist1) + [pivot] + quicksort(alist2)
def partition(alist, pivot):
alist1 = []
alist2 = []
for e in alist:
if e <= pivot:
alist1.append(e)
else:
alist2.append(e)
return (alist1, alist2)

此实现效果良好。但是看看第6行和第7行,它们分别是alist.remove(pivot)alist1, alist2 = partition(alist, pivot)。如果我试图通过如下重写第7行来将这两行合并为一行代码:alist1, alist2 = partition(alist.remove(pivot), pivot),那么我的代码就不起作用了。我得到以下类型错误:

TypeError: 'NoneType' object is not iterable

想知道我为什么会遇到这个错误吗?

remove方法不返回修改后的列表,在python中,如果函数不返回任何内容,则"返回"None

>>> a = [1, 2, 3]
>>> r = a.remove(2)
>>> r == None
True

alist.remove(pivot)没有返回实际列表,list.remove在Python 中返回None

由于alist.remove(pivot)不返回列表,因此会出现错误。

它不返回任何内容(None),只是从您的列表中删除pivot

因此,您最终传递给partition方法的是Nonetype对象,而不是列表。

最新更新