2011-01-02 7 views
1

ein. Betrachten Sie Folgendes: p1 = 1; p2 = 5; p3 = 7; höchste = max (p1, p2, p3).Erstellen Sie eine Funktion in Python, um das höchste aller Funktionsargumente zu finden, und geben Sie das "Tag" des Werts

Die Max-Funktion würde zurückgeben 7. Ich bin auf der Suche nach einer ähnlichen Funktion, die "p3" zurückgeben würde. Ich habe eine kleine Funktion (durch einfache Vergleiche) für das obige Beispiel erstellt, das unten gezeigt wird. Aber ich habe 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 einen einfacheren Weg, dies zu tun>

Antwort

5

Update: Paul Hankin wies darauf hin, dass max() eine Schlüsselfunktion übernahm, die ich nicht kannte. Also:

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

Andere Lösungen der Vollständigkeit halber:

In Python 2.7 und 3.x können Sie Wörterbuch Comprehensions 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örterbuch Verständnis sind ordentlich. :)

In früheren Versionen von Python Sie können 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 in etwas nach Python 2.2 oder so funktionieren werden.

+1

Wie wäre es mit 'return max (kw, key = kw.get)' (für Python 2.5 und höher). –

+0

Ah! Ich wusste nicht, Max hat eine Schlüsselfunktion übernommen. Ausgezeichnet! –

+0

Vielen Dank. Das war sehr hilfreich, und danke @ Paul Hankin für den Hinweis, dass max eine Schlüsselfunktion übernommen hat. – gatechgrad

5

Es gibt keine Möglichkeit, den Namen des Variable, die den höchsten Wert in denAnrufern hatten zu bekommen (weil es eine Zahl sein könnte oder ein komplexer Ausdruck), aber durch ausschließliche Verwendung von Schlüsselwortargumenten erhalten Sie den Namen des Parameters. Etwas wie folgt aus:

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 wie folgt:

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

aber der Haken ist, funktioniert es nicht, wenn eines der Argumente ist Positions:

>>> 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, dieses Konstrukt könnte nützlicher sein: (Hut Spitze zu http://lemire.me/blog/archives/2008/12/17/fast-argmax-in-python/)

>>> a = [9,99,999] 
>>> a.index(max(a)) 
2 
+0

+1 für eine gute Lösung, obwohl ich einen kürzeren gepostet. –

+3

Der Rumpf dieser Funktion kann prägnanter geschrieben werden: 'return max (kwargs, key = kwargs.get)' –

+0

'float ('- inf')' gibt -Inf, aber Sie können 'None' statt –

0

Offensichtlich behandelt es nicht Argumente mit variabler Länge. Wenn Sie ein Argument mit variabler Länge haben wollen, dann ist das ein anderes Problem. Wenn Sie 10 Argumente haben, fügen Sie sie einfach in die Definition ein und sie erhalten den korrekten Argumentnamen (nicht unbedingt mit 'p' begonnen). Aber der Haken ist die Anzahl der Argumente (3 oder 5 oder 10 oder was auch immer) ist 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)
0

Der einzige Weg, dies alles in der Nähe erweiterbar zu halten, ist eine Liste als Argument zu nehmen und den Index von seinem höchsten Elemente zurückzukehren. Sie können ein p vorstellen und mit 1 beginnen, wenn Sie wirklich wollen.

Verwandte Themen