如何在Python中使用基数排序按字母顺序对一个(非常长的)对象列表进行排序?

时间:2014-04-03 15:14:29

标签: python sorting

我正在尝试使用基数排序按字母顺序对列表中的列表进行排序。我需要按照我创建的对象的一个​​属性对列表进行排序。

注意:我不能使用内置的排序 - 我必须自己编写。我不被允许使用defaultdict所以我使用了列表。

我有一个名为results []的列表。在所有结果[]的结果[x]中,我有另一个包含长度为x的单词的列表。这些单词存储为包含原始单词(originalWord),按字母顺序排列的单词(azWord)及其长度(wLength)的单词对象。例如狗,dgo,3。

由于我有很多很多单词,所以我认为基数排序对我的目的来说是最有效的。我对Python比较陌生,所以我在编写代码时遇到了一些麻烦。我粗略地概述了它应该是什么样子但我很感激帮助修复语法。

我打算在for循环中使用radix_sort,迭代结果[]。我有一个变量maxL,它存储我拥有的最长单词(也就是结果中的列表数)。

for x in range(0,maxL):
    radix_sort(results[x], x)

这是我尝试为字符串编写基数排序。请注意,azWord属性表示为字符列表。

def radix_sort(List, length):
    buckets = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
    for i in range (0, length-1):    #for every letter "column"
        for word in List:    #for every word 
            index = ord(word[i].azWord)-ord('a')   #get the index of the word
            buckets[index].append(word)     #add word object to correct bucket
    for containedList in buckets:
        while(containedList):
            #I'm having trouble here with emptying the lists back into the bins
编辑:另外,既然我不想用完记忆(这是为了很长的一系列单词),我应该清除一些东西,因为我不去需要?

此外,目前,Eclipse正在给我一个错误"预期::预期::"对于这一行:

for i in range (0, length-1)

当前版本:

def radix_sort(List, length):
    buckets = [[], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], [], []]
    for i in range (length-1, -1, -1):    #for every letter "column"
        for word in List:    #for every word 
            index = ord(word.azWord[i])-ord('a')   #get the index of the word
            buckets[index].append(word)     #add word object to correct bucket
    List[:] = []
    for containedList in buckets:
        List.extend(containedList)

2 个答案:

答案 0 :(得分:1)

我认为你在这些方面错过了一些冒号:

for i in range (0, length-1)  # Need a colon here

for word in List  # Need a colon here

for containedList[] in buckets  # Need a colon here

while(containedList[])  # Need a colon here

答案 1 :(得分:1)

将排序后的结果放回列表中:

List[:] = []
for containedList in buckets:
    List.extend(containedList)

还有一件事,如果你期望得到合适的排序,你需要从最不重要到最重要的排序:

for i in range(length-1, -1, -1):

请注意,您的原始范围无论如何都不正确,结束点不在此范围内,因此在length-1处停止会跳过最后一个字母。