有谁能告诉我为什么这不起作用?我得到错误说:
ValueError: list.remove(x): x not in list
。
但是如果我尝试print max
;它打印9,
如果我print min
;它打印1。
list = [3,1,4,9,5,7]
max = list[0]
min = list[0]
list = list[:]
while len(list)> 2:
for i in list:
if(i > max):
max = i
elif(i < min):
min = i
list.remove(min)
list.remove(max)
print list
我需要从列表中删除max和min元素,直到只有2个元素才能获得列表的中位数。
答案 0 :(得分:1)
您的问题是您只在while
循环之外初始化一次最小和最大变量。
如果在循环内部初始化,您的代码将起作用。
此代码有效。请注意,我将变量名称更改为不是Python内置函数。你不应该使用&#34; shadow&#34;内置插件;例如,list
是内置类型,因此您不应将list
用作变量名。
lst = [3,1,4,9,5,7]
lst = lst[:]
while len(lst)> 2:
max_val = lst[0]
min_val = lst[0]
for i in lst:
if(i > max_val):
max_val = i
elif(i < min_val):
min_val = i
lst.remove(min_val)
lst.remove(max_val)
print lst
请注意,您的代码非常低效且速度慢。您可以使用内置函数max()
和min()
来加快速度,但算法仍然效率低下。
最好的方法是对列表进行排序,然后从列表中间选择单个值(对于奇数长度列表)或平均中间两个值(对于偶数长度列表)。或者只是使用Python提供的一个内置函数。
答案 1 :(得分:0)
首次运行list.remove(min); list.remove(max)
后,您的程序会再次进入while
循环,但min
和max
将保持第一次通过时的值相同循环,并且list
中没有任何内容大于max
或小于min
,变量将不会更改,因此Python将最终尝试运行{{1使用之前使用的list.remove(min); list.remove(max)
和min
相同的值。由于这些值已从max
中删除,因此会出错。
最简单的解决方案是在list
循环的开头设置min
和max
,而不是在它之前:
while
另请注意,list
,min
和max
已经是内置Python函数的名称,并且将这些名称用于常规变量被广泛认为是不好的做法。您应该将其重命名为其他内容(例如list = [3,1,4,9,5,7]
list = list[:]
while len(list)> 2:
max = list[0]
min = list[0]
for i in list:
if(i > max):
max = i
elif(i < min):
min = i
list.remove(min)
list.remove(max)
print list
,lst
和minimum
)。