在Python中创建函数以查找所有函数参数中的最大值,并返回该值的“标签”

1 投票
4 回答
3393 浏览
提问于 2025-04-16 09:17

考虑以下内容:

p1=1; p2=5; p3=7; highest=max(p1,p2,p3)。

这里的max函数会返回7。我想创建一个类似的函数,它会返回"p3"。我为上面的例子写了一个小函数(通过简单的比较),如下所示。不过,当参数数量增加时,我遇到了困难。

def highest(p1,p2,p3):
    if (p1>p2) and (p1>p3):
        return "p1"
    if (p2>p1) and (p2>p3):
        return "p2"
    if (p3>p1) and (p3>p1):
        return "p3"

有没有更简单的方法来实现这个呢?

4 个回答

0

要让这个功能尽量灵活,我们唯一的办法就是把一个列表作为输入,然后返回这个列表中最大元素的索引。如果你想的话,可以在前面加个 p,从 1 开始计数。

def highest(x):
    return 'p' + repr(x.index(max(x))+1)
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
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 之后的版本都可以用。

撰写回答