尝试快速排序,返回TypeError。

时间:2014-03-02 21:29:06

标签: python list sorting nonetype

names = ['James','Adam','Ross','Bryce','Sue','Matt','Chris','Sarah','Rachel','Aron']

def sort(names):
    less = []
    equal = []
    greater = []
    if len(names) > 1:
        pivot = names[0]
        for x in names:
            if x < pivot:
                str(less.append(x))
            elif x == pivot:
                str(equal.append(x))
            elif x > pivot:
                str(greater.append(x))
        return sort(less) + sort(equal) + sort(greater)
    else:
        if len(names) == 1:
            return names                            
print sort(names)

每当我运行它时,它都会返回此错误:

TypeError: unsupported operand type(s) for +: 'NoneType' and 'list'. 

有人可以告诉我这是怎么回事?我是Python的新手

4 个答案:

答案 0 :(得分:1)

您正尝试向None类型添加列表,如错误所示。它发生在您拥有的代码示例的第16行。

但让我们看看这些内容:

pivot = names[0]
for x in names:
    if x < pivot:
        str(less.append(x))

既然你说你是Python新手,我会解释一下。当你说x < pivot你没有问它是否在列表中出现之前,你进行了词典比较。例如,在Python中我们有:

>>> 'a' < 'b'
True

其次,str(less.append(x))也没有做任何事情。你要求它从列表操作中创建一个字符串。它将返回None类型。像这样:

>>> less = []
>>> str(less.append('hi'))
'None'

所以,在你所有的东西结束时,问题是你的函数什么都不返回,因为当列表长度为0时你没有考虑到。

答案 1 :(得分:1)

您应该检查0大小列表:

names = ['James','Adam','Ross','Bryce','Sue','Matt','Chris','Sarah','Rachel','Aron']

def sort(names):
    less = []
    equal = []
    greater = []
    if len(names) > 1:
        pivot = names[0]
        for x in names:
            if x < pivot:
                str(less.append(x))
            elif x == pivot:
                str(equal.append(x))
            elif x > pivot:
                str(greater.append(x))
        return sort(less) + sort(equal) + sort(greater)
    else:
        if len(names) == 1 or len(names) == 0:
            return names            

print sort(names)

答案 2 :(得分:0)

与python中的所有函数一样,sort函数在未显式返回某些内容时返回None。由于您不熟悉python,请先尝试在IDE中使用列表,然后再使用算法。

some_list = [1,2,3,4]
an_index = some_list.index(1)
some_list.append(5) #adding at the end of list

文档是一个非常好的起点:http://docs.python.org/2/tutorial/datastructures.html

答案 3 :(得分:0)

对空列表进行排序,在这种情况下less将返回None