鉴于以下内容:
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)
有没有更好的方法来解决这个问题?
鉴于以下内容:
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)
有没有更好的方法来解决这个问题?
内置的 max
函数可以接受一个键函数,你可以将其设置为 abs
:
>>> max([3, 7, -10], key=abs)
-10
您可以再次对结果调用 abs
来将结果归一化:>>> abs(max([3, 7, -10], key=abs))
10
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
max(map(abs, a))
是最快的,如果你需要返回abs
值。 - user2682863使用map
,将abs
作为您的函数传递,然后在其上调用max
:
>>> max(map(abs, [3, 7, -10]))
10
abs
,因此如果您要使用不同的评估函数,那将意味着更少的字符和少复制粘贴。 想象一下,如果它不是abs
而是quicksort_list
,会怎样。 - Guimoutemax()
一起使用:>>> max(abs(n) for n in [3, 7, -10])
10