Я просматриваю следующую последовательность утверждений:
>>> 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
. Они даже оценивают то же самое соответственно.
потому что все значения имеют значение 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)