Python面試題 —— 獲取列表中位數


中位數是一個可將數值集合划分為相等的上下兩部分的一個數值。如果列表數據的個數是奇數,則列表中間那個數據就是列表數據的中位數;如果列表數據的個數是偶數,則列表中間那2個數據的算術平均值就是列表數據的中位數。在這個任務里,你將得到一個含有自然數的非空數組(X)。你必須把它分成上下兩部分,找到中位數。

 

輸入: 一個作為數組的整數(int)列表(list)的。

輸出: 數組的中位數(int, float).

 

范例:

get_median([1, 2, 3, 4, 5]) == 3 get_median([3, 1, 2, 5, 3]) == 3 get_median([1, 300, 2, 200, 1]) == 2 get_median([3, 6, 20, 99, 10, 15]) == 12.5

 

如何使用: 中位數在概率論和統計學中得到應用,它偏態分布中有顯著的價值。例如:我們想從一組數據中知道人們的平均財富 -- 100人一個月收入100美元,10人一個月收入1,000,000美元。如果我們算平均值,得到的是91000美元。這是一個完全沒有向我們展示真實情況的奇怪的值。所以在這種情況下,中位數會給我們更有用的值和較好的描述。

前提: 1 < len(data) ≤ 1000 all(0 ≤ x < 10 ** 6 for x in data)

 

普通方法:

對列表進行排序,針對列表長度是奇數還是偶數的不同情況,計算中位數。

 

 1 def get_median(data):  2         data = sorted(data)  3         size = len(data)  4         if size % 2 == 0:   # 判斷列表長度為偶數
 5             median = (data[size//2]+data[size//2-1])/2
 6             data[0] = median  7         if size % 2 == 1:   # 判斷列表長度為奇數
 8             median = data[(size-1)//2]  9             data[0] = median 10         return data[0]

 

 

最佳方法:

這個解決方法非常巧妙,它利用了取反數和為1的特性,通過列表負索引來獲得列表中位數。

對 return (data[half] + data[~half]) / 2 的解釋:

排序后得到序列[1,2,3,4,5,6],其列表長度為偶數,中位數由列表中間兩位元素3(索引為2),4(索引為3)決定。而元素4的負索引為-3,正好是索引2的取反數。

排序后得到序列[1,2,3,4,5],其列表長度為奇數,中位數由列表中間元素3(索引為2,負索引為-3)決定。仍然符合代碼。

 

1 def get_median(data): 2  data.sort() 3         half = len(data) // 2
4         return (data[half] + data[~half]) / 2

 

 更多Python面試題:http://www.landsblog.com/blog/category/pythonmianshi

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM