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

Python - Cannot sort properly my list by alphabetical order

我不得不按字母顺序创建自己的 "sorted" 函数,然后在另一个函数中使用 than 函数。目的是按字母顺序对列表进行排序,我的测试列表有 4 个元素,但最终目的是将此函数应用于一个巨大的列表,这就是为什么我首先在​​几个元素上尝试它,因为它更容易分析结果。

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

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

有人知道哪里出了问题吗?我应该更正什么?

不确定在此处执行您自己的功能的想法背后的想法,但您可以通过简单地使用内置 sorted 功能轻松实现:

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

你的问题是,一旦你找到两个需要交换的项目,你就设置 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

您还可以做很多事情来改进它,但这应该让您入门。

这是最终的工作函数:

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

我添加了很多打印件以查看列表中的每个更改以及反转是 True 还是 False。

谢谢大家的回答。