|
计算整数列表的中位数
中位数又称中值,统计学中的专有名词,是指按顺序排列的一组数据中居于中间位置的数,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
所以此题中,如果列表中数据的个数是奇数,则列表中间那个数据就是列表数据的中位数;如果列表中数据的个数是偶数,则列表中间2个数据的算术平均值就是列表数据的中位数。
解析代码如下:
- def get_median(data):
- # 对列表进行排序
- data.sort()
- # 获取列表的长度
- length = len(data)
- # 初始化中位数
- median = None
- # 列表长度为偶数
- if length % 2 == 0:
- # 计算出列表中间2个数据的算术平均值
- median = (data[length // 2] + data[length // 2 - 1]) / 2
- # 列表长度为奇数
- if length % 2 == 1:
- # 计算出列表中间的数据
- median = data[(length - 1) // 2]
- return median
- ret = get_median([2, 3, 5, 4, 8, 10])
- print(ret)
复制代码 此外,本题除了上述的传统算法,还有一种非常巧妙的算法,即将列表长度整除2之后的正索引取反,然后只需要将正、负索引对应的元素相加除2,即可得到中位数。
例如,当有偶数列表[1,2,3,4,5,6],则其中位数由列表中间的两个数据3(负索引为-4)和4(负索引为-3)决定,而该列表长度整除2之后的正索引为3,其所对应的元素为4,此时,将正索引3取反,得到的恰恰是负索引-4,所对应的元素为3,正是所需要的列表中间的两个数据,所以只需要将2个正、负索引对应的元素相加除2,即可得到中位数;当有奇数列表[1,2,3,4,5],则其中位数就是列表中间的数据3,而该列表长度整除2之后的正索引为2,对应的元素为3,此时,将正索引2取反,得到的恰恰是负索引-3,所对应的元素仍为3,所以只需要将2个正、负索引对应的元素相加除2,即可得到中位数。
解析代码如下:
- def get_median(data):
- # 对列表进行排序
- data.sort()
- # 列表长度整除2
- half = len(data) // 2
- # 将正、负索引对应的元素相加除2,即可得到中位数
- median = (data[half] + data[~half]) / 2
- return median
- ret = get_median([2, 3, 5, 4, 8, 10])
- print(ret)
复制代码 |
|