在Python中创建函数以查找所有函数参数中的最大值,并返回该值的“标签”
考虑以下内容:
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 之后的版本都可以用。