Python:可用的最大值和最小值

问题描述 投票:25回答:3

Python 2.x允许比较异构类型。

[一个有用的快捷方式(在Python 2.7中是)是None比较小于任何整数或浮点值:

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

并且在Python 2.7中,空元组()是一个无限值:

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

当人们可能对整数和浮点数的混合列表进行排序,并且希望有一个绝对的最小值和最大值进行引用时,此快捷方式很有用。

此快捷方式已在Python 3000中删除(这是Python 3.2):

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

此外,关于Python 3000has removedsys.maxint的理论,即所有整数均升为long,并且该限制不再适用。

PEP 326,用于上下值的情况,在Python中增加了参考最小值和最大值。新的订购行为documented

由于PEP 326被拒绝,对于在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('inf'),需要将long值转换为浮点,并且转换将导致OverflowError ...

结论

谢谢大家的回答和评论。我选择了TryPyPy的answer,因为它似乎最符合我的要求:如Wikipedia entry on infinity.中所述的绝对最大值和绝对最小值。

有了这个问题,我了解到长整型或整型值不会转换为浮点数以完成float('inf') > 2**5000的比较。我不知道。

Python 2.x允许比较异构类型。一个有用的快捷方式(在Python 2.7中)是None小于任何整数或float值:>>> None

对于数值比较,+- float("inf")应该起作用。

它并不总是有效(但涵盖了实际情况:

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>]

当然,要覆盖“或相等”变体,需要花费更多的精力。它不能解决无法对包含Noneint的列表进行排序的一般问题,但是也可以用一些包装和/或装饰,排序和取消装饰的魔术(例如,对列表进行排序)来实现(typename, value)的元组)。

您已经在问题中拥有最明显的选择:float('-inf')float('inf')

此外,请注意,在Py2中,None小于所有值,而空元组大于所有值,[例如],Jython和PyPy完全有权使用其他顺序感觉像。可以保证的是,在该解释程序的一个运行副本中的一致性–实际顺序是任意的。

在cPython中,cmp不会执行转换以隐式浮动。即,这有效:

>>> 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...
如果要具有

a值

,则float('-inf')最小和float('inf')相当安全。确保将其缓存在循环之外:def func(): minval=float('-inf') for loop in now_you_can_loop: # otherwise float('-inf') is kinda slow
python python-3.x
3个回答
14
投票

对于数值比较,+- float("inf")应该起作用。


10
投票

您已经在问题中拥有最明显的选择:float('-inf')float('inf')


3
投票
在cPython中,cmp不会执行转换以隐式浮动。即,这有效:

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


推荐问答