2015-06-09 106 views
0

我不得不按字母順序創建自己的「排序」函數,然後在另一個函數中使用函數。我的目標是按字母順序排列一個列表,我的測試列表有4個元素,但最終目的是將這個函數應用到一個大的列表中,這就是爲什麼我先在幾個元素上嘗試它,因爲它更容易分析結果。Python - 無法按字母順序排序我的列表

這裏要說的是排序按字母順序排列的功能:

def alphaOrder(word1, word2, index): 
    if index == len(word1): 
     return [word1, word2] 
    if index == len(word2): 
     return [word2, word1] 
    if ord(word1[index]) == ord(word2[index]): 
     return alphaOrder(word1, word2, index + 1) 
    elif ord(word1[index]) < ord(word2[index]): 
     return [word1, word2] 
    else: 
     return [word2, word1] 

這裏是我試圖讓超過2個元素的列表,工作中的作用:

def sortMyList(liste): 
    continu = True 
    noInversion = False 
    i = 0 
    while continu: 
     item0 = liste[i] 
     item1 = liste[i + 1] 
     l = alphaOrder(item0, item1, 0) 
     if liste[i] != l[0]: 
      noInversion = True 

     liste[i] = l[0] 
     liste[i+1] = l[1]  
     if i + 1 < len(liste): 
      i += 1 
     else: 
      i = 0 


     if noInversion: 
      continu = False 
    return liste 

和這裏是我的測試列表來驗證我的功能是否有效:

a = [] 
a.append("aaaazza") 
a.append("anaaazza") 
a.append("anaaazz11a") 
a.append("aaaaa") 

print(a) 
print(sortMyList(a)) 

當我打印時,是我得到:

['aaaazza', 'anaaazza', 'anaaazz11a', 'aaaaa'] 
['aaaazza', 'anaaazz11a', 'anaaazza', 'aaaaa'] 

,但我應該得到:

['aaaaa', 'aaaazza', 'anaaazz11a', 'anaaazza'] 

做什麼人有什麼不對任何想法,我應該怎麼正確嗎?

+0

嘗試'a.sort()'。 –

+0

我強烈建議首先查看已建立的排序方法之一,並查看如何將這些概念應用於您的方法。 [泡泡類](http://en.wikipedia。org/wiki/Bubble_sort)是最簡單的一種,但速度很慢。 [快速排序](http://en.wikipedia.org/wiki/Quicksort)具有更好的性能,但實施起來可能稍微複雜一些。 – IanAuld

+0

此外,作爲一個提示,你不應該使用'ord()'排序,除非你想這被認爲是一個正確排序的列表:'['A','C','b']' – IanAuld

回答

0

你的問題是,一旦你找到兩個項需要進行交換,您將noInversion設置爲true,並在切換後立即從列表中退出。

你需要做的是完成整個列表,並在通過結束時只檢查你的國旗。你也需要整理反轉標誌:你希望它從false開始,當項目被交換時被設置爲true,並且如果它仍然是false,則在最後打破循環。

def sortMyList(liste): 
    continu = True 
    while continu: 
     inversion = False 
     for i in range(len(liste)-1): 
      item0 = liste[i] 
      item1 = liste[i + 1] 
      l = alphaOrder(item0, item1, 0) 
      if liste[i] != l[0]: 
       inversion = True 

      liste[i] = l[0] 
      liste[i+1] = l[1]  
     if not inversion: 
      continu = False 
    return liste 

然後有很多清理你可以做的代碼。使用break代替continu標誌,並塌陷分配到列表將幫助:

def sortMyList(liste): 
    while True: 
     inversion = False 
     for i in range(len(liste)-1): 
      item0 = liste[i] 
      item1 = liste[i+1] 
      liste[i], liste[i+1] = alphaOrder(item0, item1, 0) 
      if liste[i] != item0: 
       inversion = True 

     if not inversion: 
      break 
    return liste 

仍然有很多你可以做更多,以改善它,但應該讓你開始。

+0

他仍然會使用'ord()'對他的列表進行排序,這不會像他認爲的那樣工作它是。給定一個列表a = ['A','b','C']'並使用這些項的序數值對它進行排序,從而得到'['A','C','b']' – IanAuld

+0

受到你答案的啓發,我找到了一個辦法。謝謝 :) –

1

在這裏做你自己的功能背後的想法不知道,但你可以很容易地通過簡單地使用實現這一內置sorted功能:

>>> sorted(['aaaazza', 'anaaazza', 'anaaazz11a', 'aaaaa']) 
['aaaaa', 'aaaazza', 'anaaazz11a', 'anaaazza'] 
+0

他解釋他的問題是他試圖做出自己的功能版本,無論出於什麼原因(作業,練習等)。 – jayelm

+0

是的,但他還提到按字母順序排列的功能,這意味着他只是在尋找字母順序。 – 2015-06-09 11:56:50

+0

是的Jesse Mu是正確的,我可以使用sorted()函數,但是我必須編寫自己的排序函數 –

0

這是最後的工作職能:

def sortMyList(liste): 
continu = True 
inversion = False 
i = 0 
while continu: 
    print("i : " + str(i) + " " + str(liste)) 
    item0 = liste[i] 
    item1 = liste[i + 1] 
    print("Comparison between " + item0 + " and " + item1 + " inversion : " + str(inversion)) 
    l = alphaOrder(item0, item1, 0) 
    if liste[i] != l[0]: 
     inversion = True 
     print("I have to do an inversion : " + str(inversion)) 
    liste[i] = l[0] 
    liste[i+1] = l[1]    
    if not inversion and i+2 == len(liste): 
     continu = False   
    if (i + 2) < len(liste): 
     i += 1 
    else: 
     i = 0 
     inversion = False      
return liste 

,其結果是:

['aaaaa', 'aaaazza', 'anaaazz11a', 'anaaazza'] 

我加了很多版畫看到列表中的每一個變化,當反轉是真實或假。

謝謝你們的答案。