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