[英]ValueError: list.remove(x): x not in list 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]
感謝您的幫助!
在第一次遍歷列表時,您會找到最小元素。 但是,在第二遍時, 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
最后,您有兩個變量隱藏了內置函數: sorted
和min
。 盡管從技術上講這是可行的,但是它的形式很差,最好養成不要將局部變量命名為與內置變量相同的習慣。 按照慣例,如果它確實是對象的最佳名稱,則可以在名稱中添加下划線以將其與內置對象區分開: min_
, sorted_
和sorted_
(或者可能更好,為output
)。
如果只想對列表進行排序,則可以使用內置的sort()
函數:
>>> lst=[-8, 8, 4, -4, -2, 2]
>>> lst.sort()
>>> lst
[-8, -4, -2, 2, 4, 8]
如果要按方法排序,則代碼中有兩個小錯誤:每次刪除元素時都需要遞減lst_len
並將min
重新初始化為lst[0]
。 另外, while while應該是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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.