自學生信Python(第六天)|如何計算中位數?

如何計算中位數?

本人是一枚生物學的學生,由于對生物信息學特別感興趣,于是想自學生物信息學(新手莫怪)。了解到生物信息學要有編程基礎,尤其是要會一門編程語言,例如: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的愛好者不要像我一樣眼高手低,學習編程就是要,思考,敲碼,思考,敲碼,敲碼,再敲碼!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1. Python的hello-world: print ("Hello, Python!")、 完了 搖就完事兒...
    LunarShade閱讀 2,026評論 0 0
  • 第1章 認識JS JavaScript能做什么?1.增強頁面動態(tài)效果(如:下拉菜單、圖片輪播、信息滾動等)2.實現...
    mo默22閱讀 1,514評論 0 5
  • 返回/設置時間方法 get/setTime()返回/設置時間,單位毫秒數,計算從 1970 年 1 月 1 日零時...
    greente_a閱讀 563評論 0 0
  • 今早訓練,室友問起,“昨晚寢室十一點就關燈了,十二點左右,你還在扯衛(wèi)生紙擦窗臺干嘛,夢游?。俊比缓笠?..
    柴道一閱讀 341評論 2 0
  • 如何訓練狗狗在固定地點大小便呢?家里有了愛犬后,相應的事也就多起來了。有些朋友,特別是女性朋友對此非常著急如何讓愛...
    藍小梓閱讀 981評論 0 1

友情鏈接更多精彩內容