Crear función en Python para encontrar la más alta de todos los argumentos de la función, y devolver la “etiqueta” del valor

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

  •  14-10-2019
  •  | 
  •  

Pregunta

Tenga en cuenta lo siguiente: p1 = 1; p2 = 5; p3 = 7; más alto = max (p1, p2, p3).

La función max volvería 7. Busco para crear una función similar, que volvería "P3". He creado una pequeña función (por comparaciones simples) para el ejemplo anterior, se muestra a continuación. Sin embargo, estoy teniendo problemas cuando el número de argumentos subir.

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"

¿Hay una manera más sencilla de hacer esto>

¿Fue útil?

Solución

Actualización: Paul Hankin señaló que max () toma la función clave, que yo no sabía. Por lo tanto:

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

Otras soluciones para la integridad:

En Python 2.7 y 3.x podrá usar el diccionario por comprensión.

>>> 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'

diccionario por comprensión son ordenadas. :)

En versiones anteriores de Python se puede hacer esto:

>>> 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'

¿Qué va a trabajar en nada a partir de Python 2.2 o menos.

Otros consejos

No hay manera de obtener el nombre de la variables que tenía el valor más alto en el persona que llama (ya que podría ser un número o una expresión compleja), pero mediante el uso de argumentos de palabra clave exclusivamente, se puede obtener el nombre de la parámetro . Algo como esto:

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

funciona así:

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

pero el problema es que no funciona si alguno de los argumentos es posicional:

>>> argmax(1,2,3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argmax() takes exactly 0 arguments (3 given)

En función de lo que está haciendo, esta construcción puede ser más útil: (sombrero de punta a http://lemire.me/blog/archives/2008/12/17/fast-argmax-in-python/ )

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

La única manera de mantener esta nada parecido a extensible es tomar una lista como argumento y devuelve el índice más alto de su elemento. Usted puede poner una p delante y empezar a contar a 1 si realmente desea.

def highest(x):
    return 'p' + repr(x.index(max(x))+1)

Es evidente que la dosis no maneja argumentos de longitud variable. Si quieres argumento de longitud variable, entonces eso es una cuestión diferente. Si usted tiene 10 argumentos a continuación, hay que añadirlas en la definición y devolverá el nombre del argumento correcto (no necesariamente iniciado con 'p'). Pero el problema es el número de argumentos (3 o 5 o 10 o cualquier otra cosa) no es variable. Es necesario saber cuántos argumentos que necesite.

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top