在Python中创建函数以找到所有函数参数的最高参数,然后返回值的“标签”
题
考虑以下内容:p1 = 1; p2 = 5; p3 = 7;最高=最大(P1,P2,P3)。
最大函数将返回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"
是否有一种更简单的方法来执行此操作>
解决方案
更新:保罗·汉金(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左右之后,它将在任何情况下使用。
其他提示
没有办法获得 多变的 在 呼叫者 (因为它可能是数字或复杂的表达式),但是通过专门使用关键字参数,您可以获得 范围. 。这样的事情:
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
将其保持接近扩展的唯一方法是将列表作为参数列出,并返回其最高元素的索引。您可以将AP放在前面,如果您真的愿意,可以开始计数1。
def highest(x):
return 'p' + repr(x.index(max(x))+1)
显然,它不处理可变长度参数。如果您想要可变长度参数,那是另一个问题。如果您有10个参数,则只需在定义中添加它们,它将返回正确的参数名称(不一定以“ P”启动)。但是捕获是参数(3或5或10或其他任何)的数量不是可变的。您需要知道您需要多少个论点。
def highest(p1,p2,p3,p4,p5): d = locals() keys = d.keys() max_key = keys[0] max_val = d[max_key] for i in range(1,len(keys)): key = keys[i] val = d[key] if val > max_val: max_val = val max_key = key return max_key print highest(3,2,5,10,1) print highest(1,5,2,2,3) print highest(5,2,5,1,11) print highest(3,2,1,1,2)
不隶属于 StackOverflow