2014-03-02 54 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