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

Python:可用的最大值和最小值,python,python-3.x,Python,Python 3.x,Python2.x允许比较异构类型 一个有用的快捷方式(在这里的Python 2.7中)是None比较小于任何整数或浮点值: >>> None < float('-inf') < -sys.maxint * 2l < -sys.maxint True 当您可能对整数和浮点的混合列表进行排序,并希望引用绝对最小值和最大值时,此快捷方式非常有用 但是,在Python 3000中删除了此快捷方式(这是Python 3.2): 以及: 为了将cmp转换为浮点值,fl

Python2.x允许比较异构类型

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

>>> None < float('-inf') < -sys.maxint * 2l < -sys.maxint
True
当您可能对整数和浮点的混合列表进行排序,并希望引用绝对最小值和最大值时,此快捷方式非常有用

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

以及:


为了将cmp转换为浮点值,
float('inf')
,需要将长值转换为浮点值,转换将导致
溢出错误

结论

谢谢大家的回答和评论。我选择胰蛋白酶是因为它似乎最符合我的要求:维基百科中描述的绝对最大值和绝对最小值


通过这个问题,我了解到,为了完成
float('inf')>2**5000
的比较,long或int值不会转换为float。我不知道。

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


另外,请注意,
None
小于一切,空元组高于一切,这在Py2中是无法保证的,例如,Jython和PyPy完全有权使用不同的顺序,如果他们愿意的话。所能保证的只是解释器的一个运行副本内的一致性——实际顺序是任意的

对于数值比较,
+-float(“inf”)
应该可以工作

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

要使对象与任何其他任意对象(包括
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>]
class\u max:
def_u_ult_u(self,other):返回False
def(自我、其他):返回True
类别_min:
def_u_ult_u_u(self,other):返回True
def(self,other):返回False
最大值,最小值=_MAX(),_MIN()
打印(列表(已排序([float(“nan”)、MAX、float(“inf”)、MIN、float('-inf')、0、float(“nan”)))
#[,nan,-inf,0,inf,nan,]

当然,覆盖“或同等”变体需要更多的努力。它不会解决无法对包含
None
s和
int
s的列表进行排序的一般问题,但这也应该可以通过一些包装和/或修饰排序取消修饰(例如,对
(typename,value)
的元组列表进行排序)。

在cPython中,cmp不会隐式执行到浮点的转换。i、 例如,这项工作:

>>> float('inf') > 2**5000
True
当这显式执行恐惧转换时:

>>> float('inf') > float(2**5000)
Overflow...
正确答案IMHO本身不是逻辑变化的值:

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”)
或者,如果你需要一个数字,
sys.float\u info.max
有什么问题?IIRC异源值按其类型名称的字母顺序排列-几乎没有任何用处“Python3000删除了sys.maxint,因为所有整数都会升级为长整数,并且不再适用限制。”,不是,Python3000已经删除了
int
period。所有整数现在都是长的,这就是它被重命名的原因。“为了将cmp转换为浮点值,float('inf'),长值需要转换为浮点。”不,这不是浮点到长(或浮点到int)比较的工作方式。(这样做不行,因为那样你就失去了等式的传递性,对dict和set包容造成了各种可怕的后果。)将
float('inf')
与10**1000进行比较应该不会引起溢出错误。@carrot top你目前对float('inf')的分数不好,正如皮森所说。现在,Mark Dickinson是CPython core和lib中所有数字的当前维护者。如果他还说float('inf')是可以的,我就不会费心去寻找更多的反例了。你甚至可以把无限大的float形式分配给
MAX
MIN
,然后就开始了。
3>>float('-inf')<(3+4j)
回溯(最后一次调用):
文件“,第1行,在
TypeError:unorderable types:float()
@IgnacioVazquez Abrams:不太公平,因为任何只包含复数的列表也不可排序(以及任何一对复数):)正如其他地方提到的那样,
float('nan')
可以排序高于
float('inf')
(因为>和float(inf)造成的
不是数字类型的“真正”最大值。例如,NaN可以在“排序”容器中到处出现,甚至不能一起浮动。定制的最大值/最小值保证它们不会是第一个或最后一个;当然,这有多有用取决于用例,但似乎只要过滤掉NaN就可以了通常情况下会更好。FWIW,当容器中突然有许多分钟(或同等的作弊者)时,这种作弊行为就会发生,如果是自动排序的话,情况会更糟。
>>cmp(1.0**4999,10.0**5000)
cmp()
也在Py3中消失了。是
**
操作在这里为您提供了
溢出错误。与比较无关。哪个更快?与inf比较还是检查每个循环上的x是否为None?
>>> () > 2**5000
True
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.
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>]
>>> 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...
def func():
   minval=float('-inf')
   for loop in now_you_can_loop:
       # otherwise float('-inf') is kinda slow