2014-03-02 120 views
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: 
      return names        
print sort(names) 

每当我运行此,它返回此错误:尝试快速排序,返回TypeError。

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

有人能告诉我是什么了吗?我对Python非常陌生

+0

只是一个提示,因为你的'equal'列表中的所有内容都等于pivot,所以它不需要排序,并且可以简单地添加到中心,使得你有'return sort(less)+ equal +排序(更大)' – Adam

+0

另一个提示,快速排序有一个'就地'的好处。所以可以通过交换值在单个列表中完成。相反,这个代码在递归发生时正在创建大量新列表。 – Billiska

回答

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 

的文档是一个很好的开始的地方:​​

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

你应该没有返回值检查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) 
+0

这很重要,因为有些情况下'sort'会以空列表作为参数被调用。当发生这种情况时,原始代码返回一个'NoneType'而不是一个列表。导致+与其他结果返回一个正确的列表导致错误。 – Billiska

0

排序一个空列表,这less会在这种情况下,返回None