Подтвердить что ты не робот

Внедрение argmax в Python

Как должен реализовываться argmax в Python? Он должен быть максимально эффективным, поэтому он должен работать с итерами.

Три способа его реализации:

  • учитывая, что итерабельность пар возвращает ключ, соответствующий наибольшему значению
  • с учетом итерабельности значений возвращает индекс наибольшего значения
  • с учетом итерации ключей и функции f, верните ключ с наибольшим f(key)
4b9b3361

Ответ 1

Я изменил наилучшее найденное решение:

# given an iterable of pairs return the key corresponding to the greatest value
def argmax(pairs):
    return max(pairs, key=lambda x: x[1])[0]

# given an iterable of values return the index of the greatest value
def argmax_index(values):
    return argmax(enumerate(values))

# given an iterable of keys and a function f, return the key with largest f(key)
def argmax_f(keys, f):
    return max(keys, key=f)

Ответ 2

Является ли следующий код быстрым и путинским?

idx_max = max(enumerate(x), key=lambda x:x[1])[0]

Ответ 3

На основе ответа Нила, но специализируется на функции, которые принимают несколько аргументов.

argmax = lambda keys, func: max(imap(lambda key: (func(*key), key), keys))[1]

Например:

argmax([(5, 2), (3, 3), (2, 5)], pow)
# (2, 5)

Ответ 4

def argmax(lst):
     return lst.index(max(lst))

или аналогично:

argmax = lambda lst: lst.index(max(lst)

Ответ 5

Мне так легче было подумать об argmax: скажем, мы хотим вычислить argmax(f(y)), где y - это элемент из y. Поэтому для каждого y мы хотим рассчитать f(y) и получить y с максимальным значением f(y).

Это определение argmax является общим, в отличие от "учитывая, что итерабельность значений возвращает индекс наибольшего значения" (и это также вполне естественно ИМХО).

И..drumroll.. Python позволяет делать именно это, используя встроенный max:

best_y = max(Y, key=f)

So argmax_f (из принятого ответа) является ненужным сложным и неэффективным IMHO - это сложная версия встроенного max. Все остальные задачи, подобные argmax, должны стать ясными: просто определите правильную функцию f.