Why Does Max Behave Differently If I Pass A Lambda As Key Compared To Applying It Directly To A Map Of The Original Iterable With The Same Lambda?
Solution 1:
You are comparing two different things.
For your first case, if we look at the docs: https://docs.python.org/3/library/functions.html#max
max(arg1, arg2, *args[, key]) Return the largest item in an iterable or the largest of two or more arguments. The key argument specifies a one-argument ordering function like that used for list.sort().
Which means that the key lambda x: (-abs(x), x)
is a ordering function, which means that for every x
in iterable a
, (-abs(x), x)
is evaluated and is used to order the items for finding out the maximum element of the iterator, and according to that ordering, 1
is the maximum element
In [24]: a = [1,4,6,-8,-10]
In [40]: print(max(a, key=lambda x: (-abs(x), x), default=0))
1
For the second case, if we look at the docs: https://docs.python.org/3/library/functions.html#map
map(function, iterable, ...) Return an iterator that applies function to every item of iterable, yielding the results
Which means that the function lambda x: (-abs(x), x)
is applied to every element x
of a
, so we get back (-abs(x), x)
for every x, and the max
is applied on the updated iterator, which is the largest tuple (-1,1)
In [25]: b = list(map(lambda x: (-abs(x), x), a))
In [26]: b
Out[26]: [(-1, 1), (-4, 4), (-6, 6), (-8, -8), (-10, -10)]
In [27]: max(b)
Out[27]: (-1, 1)
Post a Comment for "Why Does Max Behave Differently If I Pass A Lambda As Key Compared To Applying It Directly To A Map Of The Original Iterable With The Same Lambda?"