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。
谢谢大家的回答。
我不得不按字母顺序创建自己的 "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。
谢谢大家的回答。