Почему max ведет себя иначе, если я передаю лямбду в качестве ключа по сравнению с применением ее непосредственно к карте исходного итерируемого с той же самой лямбда? - PullRequest
0 голосов
/ 27 мая 2019

Я пытаюсь понять, как работает ключевой аргумент в функции max, исходя из проблемы нахождения ближайшего целого числа к 0 из списка и использования положительного значения в случае наличия одинакового положительного и отрицательного значения всписок.

Я нашел это эффективное решение в Интернете, учитывая список целых чисел x:

print(max(a, key=lambda x: (-abs(x), x), default=0))

Это возвращает одно целое число, где я ожидал бы вернуть кортеж, учитывая, что лямбда преобразует каждый элемент x в кортеж, тогда я сделал это:

b = list(map(lambda x: (-abs(x), x), a))
max(b)

И этот второй пример возвращает кортеж.Почему первый возвращает отдельные элементы при сравнении кортежей, сгенерированных лямбда-выражением?

1 Ответ

1 голос
/ 27 мая 2019

Вы сравниваете две разные вещи.

Для вашего первого случая, если мы посмотрим на документы: https://docs.python.org/3/library/functions.html#max

max (arg1, arg2, * args [, ключ])
Вернуть самый большой элемент в итерируемом или самый большой из двух или более аргументов. Ключевой аргумент задает функцию упорядочения с одним аргументом, подобную той, что используется для list.sort ().

Это означает, что ключ lambda x: (-abs(x), x) является функцией упорядочения, что означает, что для каждого x в итерируемом a, (-abs(x), x) оценивается и используется для упорядочивания элементов для определения максимального элемента итератор, и в соответствии с этим порядком, 1 является максимальным элементом

In [24]: a = [1,4,6,-8,-10] 

In [40]: print(max(a, key=lambda x: (-abs(x), x), default=0))                                                                                                                       
1

Для второго случая, если мы посмотрим на документы: https://docs.python.org/3/library/functions.html#map

карта (функция, повторяемая, ...)
Возвратите итератор, который применяет функцию к каждому элементу итерируемого, получая результаты

Это означает, что функция lambda x: (-abs(x), x) применяется к каждому элементу x из a, поэтому мы возвращаем (-abs(x), x) для каждого x, а max применяется к обновленному итератору, который является самый большой кортеж (-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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...