Pythonic 方法查找列表的最大绝对值

问题描述 投票:0回答:5

鉴于以下情况:

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)

有哪些更好的方法可以解决这个问题?

python python-3.x max absolute-value
5个回答
81
投票

内置的

max
需要一个关键函数,您可以将其传递为
abs

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

您可以对结果再次调用

abs
来标准化结果:

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

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

7
投票

使用

map
,只需将
abs
作为函数传递,然后调用 max 即可:

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

5
投票

您可以将

max()
与生成器理解一起使用:

>>> max(abs(n) for n in [3, 7, -10])
10

0
投票

如果有人想保留+-号(并非所有用例都有负元素)

def max_magnitude(numbers):
 max_num = numbers[0]
 max_abs = abs(max_num)

 for num in numbers[1:]:
     abs_num = abs(num)
     if abs_num > max_abs or (abs_num == max_abs and num > max_num):
        max_num = num
        max_abs = abs_num
    elif abs_num == max_abs and num == 0 and math.copysign(1, num) > math.copysign(1, max_num):
        max_num = num
 return max_num
© www.soinside.com 2019 - 2024. All rights reserved.