寻找列表中最大绝对值的 Pythonic 方式

19

鉴于以下内容:

lst = [3, 7, -10]

我想按绝对值找到最大值。 对于上面的列表,它将是10 (abs(-10) = 10)。

我可以这样做:

max_abs_value = lst[0]
for num in lst:
    if abs(num) > max_abs_value:
        max_abs_value = abs(num)

有没有更好的方法来解决这个问题?

4个回答

76

内置的 max 函数可以接受一个键函数,你可以将其设置为 abs

>>> max([3, 7, -10], key=abs)
-10
您可以再次对结果调用 abs 来将结果归一化:
>>> abs(max([3, 7, -10], key=abs))
10

1
但我认为最终答案仍然必须是绝对值的答案。 - idjaw
太好了,我正在寻找一个内置函数,返回实际的最大绝对值,我不知道max函数有这个关键字。 - Gabriel Caldas

13
max(max(a),-min(a))

目前它是最快的,因为没有创建中间列表(对于100,000个值):

In [200]: %timeit max(max(a),-min(a))
100 loops, best of 3: 8.82 ms per loop

In [201]: %timeit abs(max(a,key=abs))
100 loops, best of 3: 13.8 ms per loop

In [202]: %timeit max(map(abs,a))
100 loops, best of 3: 13.2 ms per loop

In [203]: %timeit max(abs(n) for n in a)
10 loops, best of 3: 19.9 ms per loop

In [204]: %timeit np.abs(a).max()
100 loops, best of 3: 11.4 ms per loop

对于小列表(5个数字),我发现max(map(abs, a))是最快的,如果你需要返回abs值。 - user2682863

6

使用map,将abs作为您的函数传递,然后在其上调用max

>>> max(map(abs, [3, 7, -10]))
10

2
本来是我的第一猜测 (+1) - cs95
与 max([3, 7, -10], key=abs) 相比,有哪些优缺点? - trojek
时序分析并未显示出两者之间有太大的差异。 - idjaw
@trojek你多余地保存了一个abs,因此如果您要使用不同的评估函数,那将意味着更少的字符和少复制粘贴。 想象一下,如果它不是abs而是quicksort_list,会怎样。 - Guimoute

5
您可以使用生成器表达式与max()一起使用:
>>> max(abs(n) for n in [3, 7, -10])
10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接