下面是我用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
我想知道为什么我会遇到这个错误?
发布于 2017-01-11 01:56:44
remove方法不返回修改后的列表,在Python语言中,如果函数没有返回任何内容,它就会“返回”None
>>> a = [1, 2, 3]
>>> r = a.remove(2)
>>> r == None
True发布于 2017-01-11 01:56:51
alist.remove(pivot)不返回实际列表,list.remove在Python语言中返回None
发布于 2017-01-11 01:58:18
之所以会出现这个错误,是因为alist.remove(pivot)没有返回列表。
它不返回任何东西(None)只是从列表中删除pivot。
因此,最终传递给partition方法的是一个Nonetype对象,而不是一个列表。
https://stackoverflow.com/questions/41575236
复制相似问题