1

考虑以下情况:p1=1;p2=5;p3=7;最高=最大值(p1,p2,p3)。

max 函数将返回 7。我希望创建一个类似的函数,该函数将返回“p3”。我为上面的例子创建了一个小函数(通过简单的比较),如下所示。但是,当参数数量增加时,我遇到了麻烦。

默认最高(p1,p2,p3):
    如果(p1>p2)和(p1>p3):
        返回“p1”
    如果(p2>p1)和(p2>p3):
        返回“p2”
    如果(p3>p1)和(p3>p1):
        返回“p3”

有没有更简单的方法来做到这一点>

4

4 回答 4

5

无法获取调用者中具有最高值的变量的名称(因为它可能是数字或复杂的表达式),但是通过仅使用关键字参数,您可以获得参数的名称。像这样的东西:

def argmax(**kwargs):
    mx = -1e+400 # overflows to -Inf
    amx = None
    for k, v in kwargs.iteritems():
        if v > mx:
            mx = v
            amx = k
    return amx

像这样工作:

>>> argmax(a=1,b=2,c=3)
'c'

但问题是,如果任何参数是位置的,它就不起作用:

>>> argmax(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argmax() takes exactly 0 arguments (3 given)

根据您在做什么,此构造可能更有用:(向http://lemire.me/blog/archives/2008/12/17/fast-argmax-in-python/ 致敬

>>> a = [9,99,999]
>>> a.index(max(a))
2
于 2011-01-02T06:24:08.523 回答
5

更新:Paul Hankin 指出 max() 采用了一个我不知道的关键函数。所以:

>>> def argmax(**kw):
...   return max(kw, key=kw.get)
... 
>>> argmax(foo=3, bar=5, frotz=1, kaka=-3)
'bar'

其他完整性解决方案:

在 Python 2.7 和 3.x 中,您可以使用字典推导。

>>> def argmax(**kw):
...     wk = {v:k for k,v in kw.items()}
...     return wk[max(wk)]
... 
>>> argmax(foo=3, bar=5, frotz=1, kaka=-3)   
'bar'

字典理解很简洁。:)

在早期版本的 Python 中,您可以这样做:

>>> def argmax(**kw):
...     wk = dict([(v,k) for k,v in kw.items()])
...     return wk[max(wk)]
... 
>>> argmax(foo=3, bar=5, frotz=1, kaka=-3)   
'bar'

在 Python 2.2 之后的任何版本中都可以使用。

于 2011-01-02T12:53:19.773 回答
0

显然它不处理可变长度参数。如果您想要可变长度参数,那么这是一个不同的问题。如果您有 10 个参数,那么只需将它们添加到定义中,它将返回正确的参数名称(不一定以“p”开头)。但问题是参数的数量(3 或 5 或 10 或其他)是不可变的。你需要知道你需要多少参数。

def 最高(p1,p2,p3,p4,p5):
    d = 本地人()
    键 = d.keys()
    max_key = 键[0]
    max_val = d[max_key]
    对于范围内的 i (1,len(keys)):
        键=键[i]
        val = d[键]
        如果 val > max_val:
            最大价值 = 价值
            max_key = 键

    返回最大键

打印最高(3,2,5,10,1)
打印最高(1,5,2,2,3)
打印最高(5,2,5,1,11)
打印最高(3,2,1,1,2)
于 2011-01-02T06:37:55.690 回答
0

保持这个接近可扩展的唯一方法是将列表作为参数并返回其最高元素的索引。如果你真的想的话,你可以把 ap 放在前面并从 1 开始计数。

def highest(x):
    return 'p' + repr(x.index(max(x))+1)
于 2011-01-02T07:13:31.537 回答