Создать функцию в Python, чтобы найти самые высокие аргументы для всех функций и вернуть «тег» значения

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

  •  14-10-2019
  •  | 
  •  

Вопрос

Рассмотрим следующее: P1 = 1; P2 = 5; p3 = 7; Самый высокий = макс (P1, P2, P3).

Функция MAX вернет 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"

Есть ли более простой способ сделать это>

Это было полезно?

Решение

Обновление: Пол Ханкин отметил, что 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top