我试图将列表从最小整数排序到最大整数。不幸的是,当我尝试运行它时,我得到了上述错误。
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 :(得分: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
最后,您有两个隐含内置函数的变量:sorted
和min
。虽然这在技术上会起作用,但它的形式很差,并且养成不像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]