2017-02-14 49 views
1

去除楠我想提出哪些返回中位值的列表列表的功能,下面是我的例子:如何找到在列表中位數可以用Python

y=[1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4]

我想要計算每個元素的中位數,在我的情況下,這不是零答案將是 [3.0, 2.0, 3.5, 4.0] 我寫了下面的函數,但我確定它不是最特別的pythonic方式,我收到我正在計算的警告(「空片的平均值」)

def my_func(list1): 
    median = 0 
    list2 = [] 
    total = [] 

    for i in list1: 
    if i != 0: 
     total.append(i) 
    else: 
     median = np.median(total) 
     list2.append(median) 
     newList = [i for i in list2 if not math.isnan(i)] 
     total = [] 

return (newList) 

有沒有其他可行的方法來做同樣的操作。

回答

2

這個怎麼樣

>>> from itertools import groupby 
>>> from statistics import median 
>>> y=[1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4] 
>>> [ median(g) for k,g in groupby(y, lambda x: x!=0) if k ] 
[3, 2, 3.5, 4] 
>>> 

爲您在排序的零拆分單獨的元素,然後我用itertools.groupby做到這一點,這裏k是真或假據此對我的分組功能和g將包含那些元素非零時k爲真,並且反之亦然,並且我使用列表解析來過濾這些元件,如圖所示波紋管

>>> [ list(g) for k,g in groupby(y, lambda x: x!=0) if k ] 
[[1, 3, 3, 4, 5], [1, 2, 2, 4, 5], [1, 3, 4, 5, 4, 2], [1, 4, 5, 2, 4]] 
>>> 

的n個I使用statistics.median得到的慾望導致

numpy,如果你喜歡,但是這可能是僅此

>>> [ numpy.median(list(g)) for k,g in groupby(y, lambda x: x!=0) if k ] 
[3.0, 2.0, 3.5, 4.0] 
>>> 
+0

非常感謝它似乎工作,我需要檢查迭代工具更 – Robin

+0

是,itertools是一個真棒模塊:) – Copperfield

0

這裏是一個更簡潔的方式一窩矯枉過正,但可以說的可讀性。

這使用itertools.groupby哪些按給定的鍵功能的結果組連續的元素。在這種情況下,關鍵功能是元素是否爲零。

y = [1,3,3,4,5,0,0,0,0,0,0,0,0,1,2,2,4,5,0,0,0,0,0,1,3,4,5,4,2,0,0,0,0,0,1,4,5,2,4] 
groups = [list(group) for is_zero, group in 
      itertools.groupby(y, lambda a: a == 0) if not is_zero]] 
medians = [np.median(group) for group in groups] 
相關問題