2014-10-30 543 views
0

我試圖從最小到最大整數對列表進行排序。不幸的是,當我嘗試運行它時,出現上述錯誤。ValueError:list.remove(x):x不在列表中python

Traceback (most recent call last): 
    File "lesson_4/selection_sort.py", line 24, in <module> 
    print selection_sort([-8, 8, 4, -4, -2, 2]) # [-8, -4, -2, 2, 4, 8] 
    File "lesson_4/selection_sort.py", line 14, in selection_sort 
    lst.remove(min) 
ValueError: list.remove(x): x not in list 

這裏是selection_sort.py

的代碼
def selection_sort(lst): 
    sorted = [] 
    list_len = len(lst) # Store this now because our loop will make it 
        # smaller 
    min = lst[0] 
    i  = 1 

    while list_len > 0: 
    while i < list_len: 
     item = lst[i] 
     if item < min: 
     min = item 
     i += 1 
    lst.remove(min) 
    sorted.append(min) 

    return sorted 


# Test Code 
print "Testing" 


print selection_sort([-8, 8, 4, -4, -2, 2]) # [-8, -4, -2, 2, 4, 8] 

感謝幫助我!

+0

你知道排序函數,對嗎? https://docs.python.org/2/library/functions.html#sorted – ballsatballsdotballs 2014-10-30 20:46:09

+0

另外,你永遠不會改變list_len的值 – ballsatballsdotballs 2014-10-30 20:48:05

+1

而循環不修改列表 – Hackaholic 2014-10-30 20:49:13

回答

3

第一次通過列表時,您會發現最小元素。但是,在第二個通過時,min仍然設置爲原始列表中的最小元素。因此,item < min永遠不會成立,並且min永遠仍然是原始列表的最小元素。然後,當你嘗試移除它時,你不能,因爲你已經擺脫了前一遍的那個項目(除非有最小值的平局,在這種情況下,只要所有這些元素被移除,就會發生這種情況) 。

要解決此問題,只需在第一個循環內移動min = lst[0],以便每次將其重置爲有效值。


你也有一些其他的問題,我會提到這裏簡單介紹一下:

你永遠不更新list_len,所以你會通過外環獲得在第二階段結束時的錯誤(當你試圖超越列表的長度時)。如果沒有突破,你也會永遠循環。幸運的是,這個全局變量是不需要的:你可以在外環使用len(lst),以及與此更換你的內心while循環:

for item in lst: # But see below regarding variable names! 
    if item < min: 
     min = item 

這消除了需要跟蹤i分開,避免與列表長度的任何問題。


下一頁:這看起來像功課,所以它可能在這個時候並不重要,但它絕對是值得一提:如果我通過一個列表發送到名爲selection_sort功能,我會非常驚訝地發現,排序後,我的原始列表現在是空的!除非你明確地做了這樣的修改(例如就地排序),否則修改輸入通常是不好的形式,所以我強烈建議你在輸入副本上做所有的工作,以避免刪除所有的內容原文:

lst_copy = lst[:] # If `lst` contains mutable objects (e.g. other lists), use deepcopy instead! 
# Do stuff with lst_copy and avoid modifying lst 

最後,你有兩個變量陰影內置功能:sortedmin。雖然這在技術上會起作用,但它的形式很糟糕,最好養成不將本地變量命名爲內建變量的習慣。按照慣例,如果它確實是該對象的最佳名稱,則可以爲該名稱添加下劃線以將其與內部標識區分開來:min_sorted_(或者更好,output)。

0

如果您只是想對列表進行排序,你可以使用內置的sort()功能:

>>> lst=[-8, 8, 4, -4, -2, 2] 
>>> lst.sort() 
>>> lst 
[-8, -4, -2, 2, 4, 8] 

如果你想你的方法排序,也有你的代碼中有兩處輕微的錯誤:你需要遞減lst_len每次刪除元素並將min重新初始化爲lst[0]同時應該是while lst_len > 1,因爲長度1的列表是平凡排序的。演示如下:

>>> def selection_sort(lst): 
    sorted = [] 
    list_len = len(lst) # Store this now because our loop will make it 
        # smaller 
    min = lst[0] 
    i  = 1 
    while list_len > 1: 
    while i < list_len: 
     item = lst[i] 
     if item < min: 
     min = item 
     i += 1 
    lst.remove(min) 
    list_len-=1 # decrement length of list 
    min=lst[0] # reinitialize min 
    sorted.append(min) 
    return sorted 
>>> selection_sort([-8, 8, 4, -4, -2, 2]) 
[8, 4, -4, -2, 2] 
+1

這可能是作業...所以'lst.sort()'可能是不可接受的答案。 – jszakmeister 2014-10-30 20:54:20

+0

請編輯您的答案,以添加關於您的代碼如何工作以及如何解決OP問題的解釋。許多SO海報是新手,不會理解你發佈的代碼。 – 2014-10-30 21:16:54

相關問題