Вопрос:
Я просматриваю следующую последовательность утверждений:
>>> a = range(10) >>> min(a, key=lambda x: x < 5.3) 6 >>> max(a, key=lambda x: x < 5.3) 0
Мин и Макс дают полную противоположность тому, что я ожидал.
Документация python по min и max довольно схематична.
Может ли кто-нибудь объяснить мне, как работает “ключ”?
Лучший ответ:Содержание
Объяснение key аргумента
Ключ работает следующим образом:
a_list = [‘apple’, ‘banana’, ‘canary’, ‘doll’, ‘elephant’] min(a_list, key=len)
возвращает ‘doll’ и
max(a_list, key=len)
возвращается ‘elephant’
Вы предоставляете ему функцию, и она использует минимум или максимум результатов функции, применяемой к каждому элементу, чтобы определить, какой элемент возвращать в результате.
заявка
Если ваша функция возвращает логическое значение, например ваше, для min, оно вернет первое из минимума True или False (которое является False), которое будет 6 или первым из max (True), которое будет равно 0.
Чтобы увидеть это:
>>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> import pprint >>> pprint.pprint(dict((i, i<5.3) for i in a)) {0: True, 1: True, 2: True, 3: True, 4: True, 5: True, 6: False, 7: False, 8: False, 9: False}
Зачем?
>>> min([True, False]) False >>> max([True, False]) True
объяснение
Почему True больше, чем False?
>>> True == 1 True >>> False == 0 True >>> issubclass(bool, int) True
Оказывается, True и False очень тесно связаны с 1 и 0. Они даже оценивают то же самое соответственно.
Ответ №1
потому что все значения имеют значение True или False. Поэтому выбирается первая из каждого.
min([True, 1, False, 0])
вернет False вместо 0 потому что оба имеют одинаковое значение, но False происходит сначала
В вашем коде используется key функция с только булевыми значениями, поэтому, для min, первое False происходит при числе 6. Так что это избранный.
Что вы, вероятно, хотите сделать, это:
min(x for x in range(10) if x < 5.3)