在Python中实现argmax

Nei*_*l G 23 python python-itertools

如何在Python中实现argmax?它应该尽可能高效,因此它应该与iterables一起使用.

可以实施的三种方式:

  • 给定可迭代的对返回对应于最大值的键
  • 给定一个可迭代的值返回最大值的索引
  • 给定一个可重复的键和一个函数f,返回最大的键f(key)

Nei*_*l G 28

我修改了我找到的最佳解决方案:

# 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)
Run Code Online (Sandbox Code Playgroud)

  • @Swiss:我不知道你在哪里知道`itertools`曾经不满意.它被添加到标准库中,因此它将是一个随时可用的工具. (8认同)
  • 我不知道它是否写在任何地方 - 只是在赋值场景中,您会遭受使用“lambda”的所有缺点,而没有获得任何好处,因此命名函数更有意义。 (2认同)
  • @Swiss,您将“itertools”与“functools”混淆了——map和reduce位于后者中。 (2认同)

wal*_*l-e 20

以下代码是快速和pythonic方式吗?

idx_max = max(enumerate(x), key=lambda x:x[1])[0]
Run Code Online (Sandbox Code Playgroud)

  • 虽然这基本上是被接受的答案的精简和未注释版本,但我发现它更有用,并且`lambda`比`operator`更容易阅读(即使你不在最终解决方案中使用它) (2认同)

And*_*ark 6

基于Neil的答案,但专门针对带有多个参数的函数.

argmax = lambda keys, func: max(imap(lambda key: (func(*key), key), keys))[1]
Run Code Online (Sandbox Code Playgroud)

例如:

argmax([(5, 2), (3, 3), (2, 5)], pow)
# (2, 5)
Run Code Online (Sandbox Code Playgroud)

  • 如果你想匹配imap的速度,发电机几乎完全相同.密钥中的最大值((func(*key),key)) (3认同)

Mik*_*bov 6

我发现这种方式更容易进行考虑argmax:说我们要计算argmax(f(y))其中y是从一个项目Y.因此,对于每个y我们想要计算f(y)并获得y最大值f(y).

argmax的这个定义是通用的,不像"给定一个可迭代的值返回最大值的索引"(并且它也很自然恕我直言).

并且..drumroll .. Python允许使用内置函数完成此操作max:

best_y = max(Y, key=f)
Run Code Online (Sandbox Code Playgroud)

所以argmax_f(从接受的答案)是不必要的复杂和低效的恕我直言 - 这是一个复杂的内置版本max.此时所有其他类似argmax的任务应该变得清晰:只需定义一个合适的函数f.


Dav*_*jad 5

def argmax(lst):
     return lst.index(max(lst))
Run Code Online (Sandbox Code Playgroud)

或者类似地:

argmax = lambda lst: lst.index(max(lst)
Run Code Online (Sandbox Code Playgroud)

  • 事实上,这个比这里发布的任何其他解决方案更快. (3认同)