2015-06-09 33 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'] 

我加了很多版画看到列表中的每一个变化,当反转是真实或假。

谢谢你们的答案。