簡體   English   中英

ValueError:list.remove(x):x不在列表python中

[英]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

最后,您有兩個變量隱藏了內置函數: sortedmin 盡管從技術上講這是可行的,但是它的形式很差,最好養成不要將局部變量命名為與內置變量相同的習慣。 按照慣例,如果它確實是對象的最佳名稱,則可以在名稱中添加下划線以將其與內置對象區分開: 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.

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