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

the*_*olf 25 python python-3.x

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

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

>>> None < float('-inf') < -sys.maxint * 2l < -sys.maxint
True
Run Code Online (Sandbox Code Playgroud)

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

>>> () > float('inf') > sys.maxint
True
Run Code Online (Sandbox Code Playgroud)

当人们可能对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()
Run Code Online (Sandbox Code Playgroud)

此外,Python3000 已经删除 sys.maxint了理论上所有的内容促进了多头并且限制不再适用.

PEP 326,一个顶部和底部值的案例,在Python中提高了参考最小值和最大值.新的排序行为记录在案.

由于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 
Run Code Online (Sandbox Code Playgroud)

和:

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

然而:

>>> () > 2**5000
True
Run Code Online (Sandbox Code Playgroud)

为了cmp到浮点值,float('inf')需要将long值转换为float,转换将导致OverflowError...

结论

谢谢大家的回答和评论.我选择了TryPyPy的答案,因为它似乎最符合我的要求:绝对最大和绝对最小值,如维基百科无限条目中所述.

有了这个问题,我了解到long或int值没有转换为float以完成比较float('inf') > 2**5000.我不知道.

Try*_*yPy 14

对于数值比较,+- 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.
Run Code Online (Sandbox Code Playgroud)

要使对象与任何其他任意对象(包括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>]
Run Code Online (Sandbox Code Playgroud)

当然,需要花费更多精力来覆盖'或相同'变体.并且它不能解决无法对包含Nones和ints 的列表进行排序的一般问题,但是这也应该可以通过一点包装和/或装饰 - 排序 - 未装饰魔法(例如,对元组列表进行排序(typename, value))来实现.


lvc*_*lvc 10

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

此外,请注意,在Py2中,None小于一切并且空元组高于一切都没有得到保证,例如,Jython和PyPy完全有权使用不同的顺序,如果他们感觉到的话.所有保证的是在一个正在运行的解释器副本内的一致性 - 实际的顺序是任意的.

  • `3 >> float(' - inf')<(3 + 4j)``Traceback(最近调用last):``File"<stdin>",第1行,在<module>``TypeError:unorderable types: float()<complex()` (4认同)