2011-10-10 176 views
1

作爲python任務的一部分,我試圖在不使用sort()方法的情況下實現列表排序(升序),我認爲我的邏輯是正確的,但我一直收到錯誤:在python列表中按升序排列

sample=[23,44,12,1,6,87] 
temp=0 
for i in range(0,len(sample)): 
    if sample[i] > sample[i+1]: 
     sample[i]=temp 
     sample[i]=sample[i+1] 
     sample[i+1]=temp 

這一直給我一個列表:指數超出範圍錯誤我知道正在被事實所造成的,當我== 3中的代碼仍然做我+ 1。

需要這方面的幫助..

我改變了代碼:

for i in range(0,len(sample)-1): 
    if sample[i] > sample[i+1]: 
     temp=sample[i] 
     sample[i]=sample[i+1] 
     sample[i+1]=temp 

,消除了錯誤,但沒有對列表進行排序

+1

快速谷歌搜索將產生許多可能的排序算法。我建議你從那裏開始。至少,你的教科書中至少應該有一個。 –

+2

更改範圍(0,len(sample))中的i:'to範圍內的i(0,len(sample)-1):'。現在你只需要修復你的算法。 –

+1

什麼史蒂文說+你的交換邏輯與溫度也是錯誤的,溫度永遠不會在你的代碼中= =的左手邊 –

回答

0

len(t)被引用的代碼之外的東西你發佈了。你想

for i in range(0,len(sample)-1): 

此外,上述聲明將遞增i你,沒有必要爲i += 1聲明。 Python也會爲你處理i的初始化,所以i = 0語句也是不必要的。這些修復後,你會發現你的排序仍然不正確,但你可能會找到更好的途徑去發現原因。

+0

thanks..changed the code..still not working – jwesonga

0

我不是太熟悉Python,但我相信,當你這樣做的:

for i in range(0,len(sample)): 
    if sample[i] > sample[i+1]: 

我會嘗試將其更改爲:

for i in range(0,len(sample) - 1): 
    if sample[i] > sample[i+1]: 

希望這會有所幫助。

+0

這不是唯一的問題,這將解決即時錯誤,但不會解決算法,因爲它不會排序,檢查我的答案更詳細的信息:) – Trufa

1

我希望你明白爲什麼你的索引超出範圍錯誤。

這是一個問題,但現在讓我們來檢查一下你的代碼,因爲你有一些「概念性」的錯誤,因爲你並不完全理解你所做的代碼。

這是你的代碼實際上做了,這是當你得到這樣的錯誤,你應該怎麼想的:

sample=[23,44,12,1,6,87] 
temp=0 


for i in range(0,len(sample)-1): 
    if sample[i] > sample[i+1]: 
     temp=sample[i] 
     sample[i]=sample[i+1] 
     sample[i+1]=temp 

第一行: 你i將得到的值0,1,2至5 (在這種情況下)。

第二行: 它將檢查是否對列表的成員彼此相鄰

它會檢查第一個(從左到右)是否大於第二個,它會檢查23> 44,這將是錯誤的,所以它不會執行其餘的代碼。

i將爲1,因此您將檢查44> 12,這是真實的,因此您的代碼將執行併成功交換這兩個。

這是學習在python中交換變量而不使用臨時變量的流暢方式的好時機。

sample[i], sample[i+1] = sample[i+1], sample[i] 

查看更多關於它,谷歌python變量交換,如果你想。

回覆原始問題。

您已成功交換44和12,此列表代表[23,12,44,1,6,87]

但是,如果你繼續這樣做,它會:

交換44 1

交換44與6

不會掉44與87

不過這個名單現在將[23,12,1,6,44,87]並且您的代碼將停止執​​行,因爲i現在是5.

您是否發現了問題?

您需要重新運行幾次才能實際訂購它,因爲它不檢查列表是否已組織,而是交換彼此相鄰的成員。

所以,如果你(此特定列表)運行:

for j in range(3): 
    for i in range(0,len(sample)-1): 
     if sample[i] > sample[i+1]: 
      sample[i], sample[i+1] =sample[i+1], sample[i] 

名單將訂購。

排序像列表這樣的有序集合是一個很多研究「領域」。

我建議你閱讀排序算法,從非常簡單的排序算法開始,如泡沫排序,因爲這是你的算法(如onatm建議)。

有一些「有趣」的方法來學習這種算法,例如,check this out

如果您有興趣,也可以在this上閱讀。

This site很好地說明了算法是如何工作到排序列表的。

祝你好運,並請評論,如果您有任何疑問。