list.remove(x):x不在列表中,当试图找到中位数时

时间:2014-06-24 00:01:34

标签: python list median

有谁能告诉我为什么这不起作用?我得到错误说:
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个元素才能获得列表的中位数。

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提供的一个内置函数。

How to find Median

答案 1 :(得分:0)

首次运行list.remove(min); list.remove(max)后,您的程序会再次进入while循环,但minmax将保持第一次通过时的值相同循环,并且list中没有任何内容大于max或小于min,变量将不会更改,因此Python将最终尝试运行{{1使用之前使用的list.remove(min); list.remove(max)min相同的值。由于这些值已从max中删除,因此会出错。

最简单的解决方案是在list循环的开头设置minmax,而不是在它之前:

while

另请注意,listminmax已经是内置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 lstminimum)。