我正在寻找三个的中位数,将其用于QuickSort中的一个数据透视表。我不想导入任何统计库,因为我认为它会产生一些开销,我希望尽可能减少它。
def median(num_list):
if (num_list[0] > num_list[len(num_list) - 1]) and (num_list[0] < num_list[int(len(num_list)//2)]):
return num_list[0]
elif (num_list[int(len(num_list)//2)] > num_list[len(num_list) - 1]) and (num_list[0] > num_list[int(len(num_list)//2)]):
return num_list[int(len(num_list)//2)]
else:
return num_list[len(num_list) - 1]
这似乎每次都会返回最后一句话,我很难过......
答案 0 :(得分:1)
让Python为您完成工作。对三个元素进行排序,然后返回中间元素。
def median(num_list):
return sorted([num_list[0], num_list[len(num_list) // 2], num_list[-1]])[1]
答案 1 :(得分:1)
在Quicksort中你通常不想只知道三个的中位数,你想要排列三个值,所以最小的是在一个点,中位数在另一个点,而最大值在另一个点。但如果你真的只想要三个中位数,这里有两种方式,另外一种方法可以重新排列。
这是查找a
,b
和c
的中位数的简短方法。
return a + b + c - min(a, b, c) - max(a, b, c)
如果您只想进行比较,并获得可能是最快的代码,请认识到可能需要执行三次比较,但您只想尝试两次。 (两个比较可以处理四个案例,但有三个对象有六个安排。)尝试
if a < b:
if b < c:
return b
elif a < c:
return c
else:
return a
else:
if a < c:
return a
elif b < c:
return c
else:
return b
如果您要重新排列值a <= b <= c
,
if a > b:
a, b = b, a
if b > c:
b, c = c, b
if a > b
a, b = b, a
return b
答案 2 :(得分:1)
使用min
和max
:
>>> numlist = [21, 12, 16]
>>> a, b, c = numlist
>>> max(min(a,b), min(b,c), min(a,c))
16
>>>
走出困境 - 我有一个功能连胜,所以这里是itertools的等价物,即使它意味着导入一个模块
>>> import itertools
>>> numlist = [21, 12, 16]
>>> z = itertools.combinations(numlist, 2)
>>> y = itertools.imap(min, z)
>>> max(y)
16