【问题标题】:Python: resolve problems with my Class [closed]Python:解决我的类的问题[关闭]
【发布时间】:2013-02-25 15:47:07
【问题描述】:

我有以下课程

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) 集合以获得各种百分位数

【问题讨论】:

  • 你想得到什么,你目前得到了什么?这个问题非常不清楚。
  • 那么obs 应该是什么?你不把它传进去。
  • 我不明白你所说的正确集合是什么意思,但我在你的代码中注意到的一件事是 get_percentile 需要一个名为 obs 的第一个参数,你没有通过。
  • 不,他传递的是 obs,计算所有指标的值,而不是 args,所需的百分位数。
  • 视情况而定。你想如何初始化Metric

标签: python class optimization coding-style


【解决方案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)

用法同上。

【讨论】:

  • 感谢@Junuxx,但我希望找到一个可以使用 def __init__(self,*args) 的解决方案
  • @Gianni:见编辑。可以做到,但有点笨拙。除非您使用某种方法将 *args 中的两组数字分开,否则无法分辨出什么是值以及什么是百分位数。
猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
  • 2016-05-03
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多