[英]What's wrong with my python selection sort?
我不知道為什么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>
我想我了解列表索引超出范圍的部分,但是我不確定為什么當i = 1時6成為第二個元素。機器沒有讀取我的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
首先,請注意您的代碼段中:
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]
開頭的子列表的最小值,所以在任何情況下都不可能大於后者。
因此,請丟失這三個語句中的最后兩個-它們與檢查if 2+2 != 4:
:-)一樣有用。
接下來,請注意,您實際上並不希望min_num
是一個值 (這是您對min
的調用所提供的),而是希望它成為列表的索引 ,以便執行交換:
num_list[i], num_list[min_num] = num_list[min_num], num_list[i]
但是,嘗試通過index
方法將值轉換為索引是很困難的:如果輸入列表可以有任何重復項,則index
總是會找到它們中的第一個,這很可能使您糾結。 我個人會選擇不去那里。
而是考慮通過min
key=
的key=
功能使用相應值查找最小索引的更直接路徑。 即:
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內置插件( min
, max
, sorted
,...)的key=
功能,那確實是一件好事。
它對某個序列進行排序(或給出min或max或),並在將序列的每個項目傳遞給您作為key=
傳遞的“密鑰提取函數”之后進行比較。 在這里,您需要“最小值的索引”,然后通過使用key=
來選擇最小值索引,該索引的每個索引對應於列表中的每個索引。
我個人不喜歡lambda,並且可能會使用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
我發現這是執行此任務最易讀,最優雅的方法。
問題是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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.