如何計算中位數?
本人是一枚生物學的學生,由于對生物信息學特別感興趣,于是想自學生物信息學(新手莫怪)。了解到生物信息學要有編程基礎,尤其是要會一門編程語言,例如:R語言、Python、Perl等,還要熟悉Linux系統(tǒng),作為生信小白,聽說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()的區(qū)別
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的愛好者不要像我一樣眼高手低,學習編程就是要,思考,敲碼,思考,敲碼,敲碼,再敲碼!