Erstellen Sie die Funktion in Python, um die höchste aller Funktionsargumente zu finden, und geben Sie das „Tag“ des Wertes zurück
Frage
Betrachten Sie Folgendes: p1 = 1; P2 = 5; p3 = 7; höchste = max (p1, p2, p3).
Die MAX -Funktion würde zurückgeben. 7. Ich möchte eine ähnliche Funktion erstellen, die "p3" zurückgeben würde. Ich habe eine kleine Funktion (durch einfache Vergleiche) für das obige Beispiel erstellt, das unten gezeigt wurde. Ich habe jedoch Probleme, wenn die Anzahl der Argumente steigt.
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"
Gibt es eine einfachere Möglichkeit, dies zu tun?
Lösung
UPDATE: Paul Hankin wies darauf hin, dass max () eine Schlüsselfunktion übernahm, die ich nicht kannte. So:
>>> def argmax(**kw):
... return max(kw, key=kw.get)
...
>>> argmax(foo=3, bar=5, frotz=1, kaka=-3)
'bar'
Andere Lösungen für die Vollständigkeit:
In Python 2.7 und 3.x können Sie Wörterbuchverständnisse verwenden.
>>> 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'
Wörterbuchverständnisse sind ordentlich. :)
In früheren Versionen von Python können Sie dies tun:
>>> 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'
Die nach Python 2.2 oder so funktionieren.
Andere Tipps
Es gibt keine Möglichkeit, den Namen des Variable das hatte den höchsten Wert in der Anrufer (Da es sich möglicherweise um eine Zahl oder ein komplexer Ausdruck handelt) Parameter. Etwas wie das:
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
Funktioniert so:
>>> argmax(a=1,b=2,c=3)
'c'
Aber der Haken ist, es funktioniert nicht, wenn eines der Argumente Position ist:
>>> argmax(1,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: argmax() takes exactly 0 arguments (3 given)
Je nachdem, was Sie tun, ist dieses Konstrukt möglicherweise nützlicher: (Hut -Tipp zu http://lemire.me/blog/archives/2008/12/17/fast-argmax-in-python/ )
>>> a = [9,99,999]
>>> a.index(max(a))
2
Die einzige Möglichkeit, dies nahe an Extensible zu halten, besteht darin, eine Liste als Argument zu nehmen und den Index seines höchsten Elements zurückzugeben. Sie können AP vorstellen und mit dem Zählen von 1 beginnen, wenn Sie wirklich wollen.
def highest(x):
return 'p' + repr(x.index(max(x))+1)
Offensichtlich dosiert es keine Argumente mit variabler Länge. Wenn Sie ein Argument für variable Länge wünschen, ist dies ein anderes Problem. Wenn Sie 10 Argumente haben, fügen Sie sie einfach in die Definition hinzu und es wird den richtigen Argumentnamen zurückgeben (nicht unbedingt mit 'P' begonnen). Der Haken ist jedoch die Anzahl der Argumente (3 oder 5 oder 10 oder was auch immer) nicht variabel. Sie müssen wissen, wie viele Argumente Sie benötigen.
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)