簡體   English   中英

我的python選擇排序有什么問題?

[英]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內置插件( minmaxsorted ,...)的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM