Python: используемые значения Max и Min

Python 2.x позволяет сравнивать гетерогенные типы.

Полезный ярлык (в Python 2.7 здесь) заключается в том, что None сравнивает меньше любого целого или плавающего значения:

 >>> None < float('-inf') < -sys.maxint * 2l < -sys.maxint True 

А в Python 2.7 пустой кортеж () является бесконечным значением:

 >>> () > float('inf') > sys.maxint True 

Этот ярлык полезен, если вы можете отсортировать смешанный список int и float и хотите иметь абсолютный минимум и максимум для ссылки.

Этот ярлык был удален в Python 3000 (это Python 3.2):

 >>> None < 0 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unorderable types: NoneType() < int() 

Кроме того, Python3000 удалил sys.maxint на теорию о том, что все ints продвигаются к longs, и лимит больше не применяется.

PEP 326 , «Случай для верхних и нижних значений», в Python вывел ссылку min и max. Задокументировано новое поведение заказа.

Поскольку PEP 326 был отклонен, какие полезные, пригодные для использования определения для значения min и max, которые работают с целыми числами и плаваниями и longs на Python 2X и Python 3000?

редактировать

Несколько ответов идут по строкам «просто используйте maxv = float (« inf »)» … Причина, по которой я думаю, насколько это возможно, заключается в следующем:

 >>> float(2**5000) Traceback (most recent call last): File "<stdin>", line 1, in <module> OverflowError: long int too large to convert to float 

А также:

 >>> cmp(1.0**4999,10.0**5000) Traceback (most recent call last): File "<stdin>", line 1, in <module> OverflowError: (34, 'Result too large') 

Все же:

 >>> () > 2**5000 True 

Для того чтобы cmp до значения float, float('inf') , длинное значение нужно было бы преобразовать в float, и преобразование вызовет OverflowError

Вывод

Спасибо всем за ваши ответы и комментарии. Я выбрал ответ TryPyPy, потому что он казался наиболее встроенным в то, что я спрашивал: абсолютное наибольшее и абсолютное наименьшее значение, как описано в записи Википедии на бесконечности.

С этим вопросом я узнал, что значение long или int не преобразуется в float, чтобы завершить сравнение float('inf') > 2**5000 . Я не знал этого.

3 Solutions collect form web for “Python: используемые значения Max и Min”

Для численных сравнений должно работать +- float("inf") .

EDIT: он не всегда работает (но охватывает реалистичные случаи):

 print(list(sorted([float("nan"), float("inf"), float("-inf"), float("nan"), float("nan")]))) # NaNs sort above and below +-Inf # However, sorting a container with NaNs makes little sense, so not a real issue. 

Чтобы иметь объекты, которые сравниваются как выше, так и ниже с любыми другими произвольными объектами (включая inf , но исключая другие читеры, как показано ниже), вы можете создавать классы, которые определяют свои максимальные / минимальные значения в своих специальных методах для сравнения:

 class _max: def __lt__(self, other): return False def __gt__(self, other): return True class _min: def __lt__(self, other): return True def __gt__(self, other): return False MAX, MIN = _max(), _min() print(list(sorted([float("nan"), MAX, float('inf'), MIN, float('-inf'), 0,float("nan")]))) # [<__main__._min object at 0xb756298c>, nan, -inf, 0, inf, nan, <__main__._max object at 0xb756296c>] 

Конечно, для покрытия вариантов «или равно» требуется больше усилий. И это не решит общую проблему неспособности сортировать список, содержащий None s и int s, но это тоже должно быть возможно с небольшим обертыванием и / или украшением-sort-undecorate magic (например, сортировка списка кортежей (typename, value) ).

У вас есть наиболее очевидный выбор в вашем вопросе: float('-inf') и float('inf') .

Кроме того, обратите внимание, что в Py2 не было гарантировано ничто, меньшее всего, а пустой кортеж был выше, чем все, и, например, Jython и PyPy имеют право использовать другой порядок, если им это нравится. Все, что гарантировано, является согласованностью в пределах одной запущенной копии интерпретатора – фактический порядок произволен.

В cPython cmp не выполняет преобразование в float неявно. т.е. это работает:

 >>> float('inf') > 2**5000 True 

Хотя это явно выполняет преобразование страха:

 >>> float('inf') > float(2**5000) Overflow... 

Правильный ответ, ИМХО, не является само по себе изменением логики:

 def func_with_min(): minval=None for loop in list_with_mins: if minval is None or minval<minseen: # do that min thing you wanna do... 

Если вы хотите иметь значение, тогда float('-inf') для min и float('inf') довольно безопасен. Не забудьте сделать кеш вне этого цикла:

 def func(): minval=float('-inf') for loop in now_you_can_loop: # otherwise float('-inf') is kinda slow 
  • Python 3: Изменить значения по умолчанию для параметров существующей функции?
  • Что означает {0} в этой строке Python?
  • Почему «12345» .count ('') возвращает 6, а не 5?
  • настроить возвращенный код 256 - python setup.py egg_info не удалось с кодом ошибки 1 в / tmp / pip_build_root / lxml
  • Почему я не могу использовать ttk в Python?
  • Python не может обрабатывать строку чисел, начиная с 0. Почему?
  • Добавление баров ошибок поверх гистограмм в Bokeh
  • Метод возврата уравнения прямой с учетом двух точек
  • Python - лучший язык программирования в мире.