Как ключи работают в мин и макс?

Вопрос: Я просматриваю следующую последовательность утверждений: >>> a = range(10) >>> min(a, key=lambda x: x < 5.3) 6 >>> max(a, key=lambda x: x < 5.3) 0 Мин и Макс дают полную противоположность тому, что я ожидал. Документация python по min и max довольно схематична. Может ли кто-нибудь объяснить мне, как работает "ключ"? Лучший ответ: Объяснение

Вопрос:

Я просматриваю следующую последовательность утверждений:

>>> a = range(10) >>> min(a, key=lambda x: x < 5.3) 6 >>> max(a, key=lambda x: x < 5.3) 0

Мин и Макс дают полную противоположность тому, что я ожидал.

Документация python по min и max довольно схематична.

Может ли кто-нибудь объяснить мне, как работает “ключ”?

Лучший ответ:Содержание

  1. Объяснение key аргумента
  2. заявка
  3. объяснение

Объяснение 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)

Оцените статью
Добавить комментарий