这是我在Python中使用quicksort的实现:
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:
TypeError: 'NoneType' object is not iterable
想知道为什么我会遇到这个错误?
答案 0 :(得分:2)
remove
方法不返回修改后的列表,而在python中,如果函数没有返回任何内容,它会返回&#34; None
>>> a = [1, 2, 3]
>>> r = a.remove(2)
>>> r == None
True
答案 1 :(得分:1)
alist.remove(pivot)
未返回实际列表,list.remove
在Python中返回None
答案 2 :(得分:1)
您收到错误,因为alist.remove(pivot)
未返回列表。
它不会返回任何内容(None
)只是从列表中删除pivot
。
因此,您最终传递给您的partition
方法是Nonetype
对象而不是列表。