Python - 无法按字母顺序正确排序我的列表

时间:2015-06-09 11:52:07

标签: python function sorted

我必须创建自己的"排序"按字母顺序排列功能,然后在另一个功能中使用功能。目的是按字母顺序对列表进行排序,我的测试列表有4个元素,但最终的目的是将这个功能应用到一个巨大的列表中,这就是为什么我首先在​​几个元素上尝试它,因为它& #39;更容易分析结果。

这是按字母顺序排序的函数:

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']

有人知道什么是错的,我应该纠正什么?

3 个答案:

答案 0 :(得分:1)

不确定在这里做自己的功能的想法,但你可以通过简单地使用内置的sorted函数轻松实现这一点:

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

答案 1 :(得分:0)

您的问题是,一旦找到需要交换的两个项目,您可以设置noInversion为真,并在切换后立即从列表中退出。

您需要做的是完成一次完整的传递,并且只在传球结束时检查您的旗帜。你还需要整理反转标志:你希望它从false开始,在交换项时设置为true,如果它仍然是假,则在最后打破循环。

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

你可以做更多的事情来改善它,但这应该让你开始。

答案 2 :(得分:0)

这是最终的工作职能:

MyArray<T>

结果是:

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

我添加了大量的打印件,以查看列表中的每个更改以及反转的时间是真还是假。

谢谢你们的答案。