2015-02-12 44 views
0

我想不通爲什麼Python程序產生下面的輸出:我的Python選擇排序有什麼問題?

c:\Python Programs>selection_sort.py 

[7, 4, 2, 9, 6] 

[2, 4, 7, 9, 6] 
[2, 6, 7, 9, 4] 
[2, 6, 4, 9, 7] 
Traceback (most recent call last): 
    File "J:\Python Programs\Python Practice\selection_sort.py", line 11, in <modu 
le> 
    num_list[i], num_list[min_num] = num_list[min_num], num_list[i] 
IndexError: list index out of range 

c:\Python Programs> 

我想我明白了列表索引超出範圍的部分,但我不知道爲什麼6成爲第二個元素當我= 1。沒有機​​器讀取我的if語句?

這裏是代碼如下:

num_list = [7,4,2,9,6] 
len_num_list = len(num_list) 
print num_list 
print""#print empty string to separate the original list from the following iterations 
for i in range(0,len_num_list): 
    min_num = min(num_list[i:]) #finds minimum number in list to the right of i 
    if min_num>num_list[i]: 
     min_num = num_list[i] 
    num_list[i], num_list[min_num] = num_list[min_num], num_list[i] 
    print num_list 

回答

0

的問題是,min(num_list[i:])返回從列表中的號碼,而不是一個索引到該列表中。您可以使用index方法獲取與min(num_list[i:])對應的索引。因此,嘗試:

num_list = [7,4,2,9,6] 
len_num_list = len(num_list) 
print num_list 
print""#print empty string to separate the original list from the following iterations_ 
for i in range(0,len_num_list): 
    min_num = min(num_list[i:]) #finds minimum number in list to the right of i 
    j = num_list.index(min_num) 
    if min_num>num_list[i]: 
     min_num = num_list[i] 
    num_list[i], num_list[j] = num_list[j], num_list[i] 
    print num_list 

這將產生輸出:

[7, 4, 2, 9, 6] 

[2, 4, 7, 9, 6] 
[2, 4, 7, 9, 6] 
[2, 4, 6, 9, 7] 
[2, 4, 6, 7, 9] 
[2, 4, 6, 7, 9] 
1

首先,我們注意到,在您的片段:

min_num = min(num_list[i:]) #finds minimum number in list to the right of i 
if min_num>num_list[i]: 
    min_num = num_list[i] 

if永遠,永遠比賽 - 由於min_num是以num_list[i]開頭的子列表中的最小者,因此在任何情況下都不可能有b e大於後者。

因此,失去這三條語句中的最後兩條 - 它們與檢查if 2+2 != 4: :-)一樣有用。

接下來,讓我們注意,你真的不希望min_num成爲(這是你對min電話給你) - 你希望它是一個指數進入榜單,爲了執行交換:

num_list[i], num_list[min_num] = num_list[min_num], num_list[i] 

但是,試圖通過index方法把一個值的指數是一個相當玄乎路徑:如果輸入列表可以有任何重複,index總是會找到他們的第一個,那很可能會把你搞砸。我個人會選擇不去那裏。

而是考慮通過的minkey=功能使用相應的找到最低指數的更直接的路徑!即:

for i in range(0,len_num_list): 
    min_ind = min(range(i, len_num_list), 
        key=lambda j: num_list[j]) 
    num_list[i], num_list[min_ind] = num_list[min_ind], num_list[i] 
    print num_list 

如果你不熟悉Python的許多內置插件(minmaxsorted,...),這真是一個很好的學習東西的key=功能。

它通過將通過key=傳遞的「密鑰提取函數」傳遞序列中的每個項目之後完成比較(或給出min,或max或)某個序列。在這裏,你需要「最小值的索引」,你可以通過選擇最小索引,並將key=的每個索引查找到列表中。

我個人不喜歡的λ和可能使用key=numlist.__getitem__,但是這不是很可讀或者 - 最可讀的始終是使用def(我會做該交換功能相同),如..:

def item_in_list(index): return num_list[index] 
def swap(i, j): num_list[i], num_list[j] = num_list[j], num_list[i] 
for i in range(0,len_num_list): 
    min_ind = min(range(i, len_num_list), key=item_in_list) 
    swap(i, min_ind) 
    print num_list 

這是我發現這個任務最可讀和最優雅的方法。