2014-04-03 55 views
2

我正在嘗試按照字母順序使用基數排序對列表內的列表進行排序。我需要按照我創建的對象的屬性之一對列表進行排序。我如何按字母順序排列Python中使用基數排序的對象列表(非常長)?

注:我不能使用內置排序 - 我必須自己寫。我沒有被允許使用defaultdict,因此我使用了列表。

我有一個名爲results []的列表。在所有結果[]的結果[x]中,我有另一個包含長度爲x的單詞的列表。這些單詞存儲爲包含原始單詞(originalWord),按字母順序的單詞(azWord)及其長度(wLength)的單詞對象。例如dog,dgo,3.

由於我有很多很多的話,我決定基數排序對我的目的來說是最有效的。我對Python比較新,所以我在編寫代碼時遇到了一些麻煩。我對它應該是什麼樣子有一個粗略的概述,但我希望能幫助你解決這個問題。

我正計劃在for循環中使用radix_sort,該循環遍歷結果[]。我有一個變量maxL,它存儲了我擁有的最長的單詞(也就是結果中的列表數)。

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

這是我爲字符串編寫基數排序的嘗試。請注意,azWord屬性表示爲char列表。

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) 
+0

你看過[示例實現](http://en.wikipedia.org/wiki/Radix_sort#Example_in_Python)嗎? –

+0

是的,但我沒有發現它對我的情況特別有用,因爲我正在處理列表中的對象中的字符串。我被語法和如何獲取所有信息所拋棄。 – Michi

回答

1

爲了把排序結果回列表:

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

一件事,你需要從排序至少顯著,如果你期望的正確排序最顯著:

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

請注意,您的原始範圍是不正確的,無論如何,終點ISN」 t包含在範圍內,因此在length-1處停止跳過最後一個字母。

+0

我用「最新版本」更新了我的問題。它似乎在工作 - 謝謝你。我正在嘗試查看我的排序是否正確。如果我想在'for x in range(0,maxL)'循環中添加一個print語句,應該是什麼語法?我希望沿着print(結果[x] .azWord)行(確保它們確實按字母順序排列,並且所有單詞都已排序)。 – Michi

+0

@Michi,剛剛打印結果[x]'怎麼樣?我認爲這只是爲了調試目的,所以它不一定非常漂亮。 –

+0

'print results [x]'只是給了我十六進制,所以它不是很有用。實際上,我確實需要它很漂亮,並計算出在我的程序的下一步中如何訪問originalWord和azWord屬性。現在,我希望它爲results []中的所有單詞對象(後基數排序)都打印originalWord和azWord。 – Michi

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 
+0

你能否重寫你的答案而沒有那些實際的冒號?現在這聽起來很混亂,我花了一段時間想着冒着什麼冒號... – Dunno

+0

@Dunno:更好? –

+0

啊是的。當然。我已更新原始帖子。我對清空桶有點困惑。 – Michi