2013-02-25 64 views
0

我有以下類的Python:解決問題,我的類

def get_percentile(obs,*args): 
    lstper = [] 
    for arg in args: 
     lstper.append(np.percentile(obs,arg)) 
    return lstper 

get_percentile([1,2,3,4,5],25,50,75) 
[2.0, 3.0, 4.0] 

class Metric(object): 
    def __init__(self,*args): 
     self.max = max(args) 
     self.median =np.median(args) 
     self.min = min(args) 
     self.percentile = get_percentile(args) 

我無法理解一組正確的self.percentile = get_percentile(args)爲了得到各種百分

+3

你想要得到什麼,那你現在得到什麼?這個問題很不明確。 – 2013-02-25 15:49:48

+1

,什麼是'obs'應該是呢?你不通過它。 – 2013-02-25 15:50:02

+0

這取決於。你想如何初始化「度量」? – Junuxx 2013-02-25 15:51:50

回答

1

只是一個解決這個辦法是使用命名關鍵字參數,而不是*args

def get_percentile(obs,*args): 
    if len(args) == 0: 
     args = [25,50,75] # default to quartiles 
    lstper = [] 
    for arg in args: 
     lstper.append(np.percentile(obs,arg)) 
    return lstper 

class Metric(object): 
    def __init__(self, values=[], percentiles=[]): 
     self.max = max(values) 
     self.median =np.median(values) 
     self.min = min(values) 
     self.percentile = get_percentile(values, percentiles) 

在行動:

>>> m = Metric(range(30,300,13), [20,40,60,80]) 
>>> m.max 
290 
>>> m.percentile 
[[82.0, 134.0, 186.0, 238.0]] 

另外,如果你想使用args留着,你可以給在列表中的值和百分位數(或元組類型的字典,集合,...)。這是必要的,否則不可能知道哪裏結束,哪裏開始:

class Metric(object): 
    def __init__(self, *args): 
     if not len(args) == 2: 
      raise ValueError("Usage: Metric([values],[percentiles])") 
     values, percentiles = args 
     self.max = max(values) 
     self.median =np.median(values) 
     self.min = min(values) 
     self.percentile = get_percentile(values, percentiles) 

用法同上。

+0

謝謝@Junuxx,但我希望找到一個解決方案,我可以使用def __init __(self,* args) – 2013-02-25 15:59:48

+1

@Gianni:請參閱編輯。它可以完成,但有點笨拙。除非你用某種方式在你的* ARGS的兩組數字分開,這將是不可能告訴什麼是價值,什麼是百分。 – Junuxx 2013-02-25 16:05:14