如何计算中位数?
本人是一枚生物学的学生,由于对生物信息学特别感兴趣,于是想自学生物信息学(新手莫怪)。了解到生物信息学要有编程基础,尤其是要会一门编程语言,例如:R语言、Python、Perl等,还要熟悉Linux系统,作为生信小白,听说Python挺简单的,于是就自学了Python,花了两天时间了解了Python的基础语法后,今天想做个练习题试试手(实践是检验真理的唯一标准),下面是练习题:(试题来源:《PYTHON生物信息学数据管理》)
今日练习题:如何计算中位数?
除了计算标准差,还有一种有用的度量是中位数,该值将一个数据集分成相等的两半。 计算数字列表的中位数时,要对数据进行排序。元素个数是奇数还是偶数会导致计算略有不同 :
关于中位数的计算,书中给出的原始代码是:
data = [3.53,3.47,3.51,3.72,3.43]
data.sort()
mid = len(data)/2
if len(data)%2 == 0:
median = (data[mid-1] + data[mid]) / 2.0
else:
median = data[mid]
print median
很显然书中给出的代码还是Python 2.X 的版本代码,在我的Python 3.X已经无法运行,可是将print median改为print (median)任然会报错,原因是data[mid]中的列表索引只对整数值,此时的mid很显然等于2.5,是一个浮点数,那么问题来了,怎么把2.5变成整数呢?!这里就要用到取整函数了,而且列表索引是按照0-N的顺序排列的,对于这5个数,中位数很显然是第三个,所以,索引时应该是data[2]才对,那么就要用到向下取整的math.floor函数了。于是增加了向下取整函数之后,正确代码是:
import math
data = [3.53,3.47,3.51,3.72,3.43]
data.sort()
mid = len(data)/2
if len(data)%2 == 0:
median = (data[mid-1] + data[mid]) / 2.0
else:
median = data[math.floor(mid)]
print(median)
在对这个计算脚本进行升级前,先来科普一下取整函数,巩固复习一下
Math.round(),Math.ceil(),Math.floor()的区别
1.Math.round():根据“round”的字面意思“附近、周围”,可以猜测该函数是求一个附近的整数,看下面几个例子就明白。
小数点后第一位<5
正数:Math.round(11.46)=11
负数:Math.round(-11.46)=-11
小数点后第一位>5
正数:Math.round(11.68)=12
负数:Math.round(-11.68)=-12
小数点后第一位=5
正数:Math.round(11.5)=12
负数:Math.round(-11.5)=-11
总结:(小数点后第一位)大于五全部加,等于五正数加,小于五全不加。
2.Math.ceil():根据“ceil”的字面意思“天花板”去理解;
例如:
Math.ceil(11.46)=Math.ceil(11.68)=Math.ceil(11.5)=12
Math.ceil(-11.46)=Math.ceil(-11.68)=Math.ceil(-11.5)=-11
3.Math.floor():根据“floor”的字面意思“地板”去理解;
例如:
Math.floor(11.46)=Math.floor(11.68)=Math.floor(11.5)=11
Math.floor(-11.46)=Math.floor(-11.68)=Math.floor(-11.5)=-12
接下来就是对上面的脚本进行升级了,此次升级还是增加了获取用户输入的功能,由于前面几篇文章已经讲解过了,下面就不再详细讲解,直接分部解析思路上代码。
第一步:导入模块
首先导入涉及到的模块永远是首要的
import math
第二步:获取用户输入
data=[]
i = 0
data1 = input("请输入数值:",).split(',')
for i in range(0,len(data1)):
data.append(eval(data1[i]))
i=i+1
第三步:计算公式
data.sort()
mid = len(data)/2
mid2 = math.floor(mid)
if len(data)%2 == 0:
median = (data[mid-1] + data[mid]) / 2.0
else:
median = data[mid2]
第四步:输出结果
print(median)
最后将完整代码汇总如下:
import math
data=[]
i = 0
data1 = input("请输入数值:",).split(',')
for i in range(0,len(data1)):
data.append(eval(data1[i]))
i=i+1
data.sort()
mid = len(data)/2
mid2 = math.floor(mid)
if len(data)%2 == 0:
median = (data[mid-1] + data[mid]) / 2.0
else:
median = data[mid2]
print(median)
使用简单的几行代码,实现获取用户输入,并计算出用户输出的结果。感兴趣的蛇友们,还可以加入异常判断,如果用户输入的不是数字而是别的什么,实现也能使程序运行不报错,而且能提醒用户重新输入数据的功能。
日常结尾:
虽然这是个小小的计算程序,但对于初学者的我来说每一次对原代码的升级改造,哪怕是读懂后的注释都感觉是一次进步提升,总之代码虽小,动手最重要!希望更多学习Python的爱好者不要像我一样眼高手低,学习编程就是要,思考,敲码,思考,敲码,敲码,再敲码!