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

时间:2014-10-30 20:43:29

标签: python python-2.7

我试图将列表从最小整数排序到最大整数。不幸的是,当我尝试运行它时,我得到了上述错误。

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]

感谢帮助我!

2 个答案:

答案 0 :(得分: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。虽然这在技术上会起作用,但它的形式很差,并且养成不像localins那样命名局部变量的习惯是最好的。按照惯例,如果它确实是对象的最佳名称,您只需在名称中添加下划线以区别于内置:min_sorted_(或者更好,{ {1}}),例如。

答案 1 :(得分: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]