2014-10-30 78 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

相关问题