Erstellen Sie die Funktion in Python, um die höchste aller Funktionsargumente zu finden, und geben Sie das „Tag“ des Wertes zurück

StackOverflow https://stackoverflow.com/questions/4577345

  •  14-10-2019
  •  | 
  •  

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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top