31

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は、すべての int が long に昇格し、制限が適用されなくなるという理論を削除しました。 sys.maxint

PEP 326、A Case for Top and Bottom Values は、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 

と:

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

float 値に cmp するにfloat('inf')は、long 値を float に変換する必要があり、変換によりOverflowError...

結論

皆さん、回答とコメントをありがとうございます。私がTryPyPyの答えを選んだのは、それが私が求めていたものと最も一致しているように見えたからです:無限に関するウィキペディアのエントリで説明されている絶対最大値と絶対最小値です。

この質問で、 の比較を完了するために long または int 値が float に変換されないことを知りましたfloat('inf') > 2**5000。私は知りませんでした。

4

3 に答える 3

16

数値比較のために、+- 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>]

もちろん、「または同等の」バリアントをカバーするには、より多くの労力が必要です。Noneまた、 sとsを含むリストを並べ替えることができないという一般的な問題は解決されませんがint、少しのラッピングや装飾-並べ替え-装飾解除の魔法(たとえば、のタプルのリストの並べ替え(typename, value))を使用すれば、それも可能です。

于 2012-05-14T03:52:35.700 に答える
11

あなたの質問にはすでに最も明白な選択肢があります:float('-inf')float('inf').

また、Noneすべてよりも小さく、空のタプルがすべてよりも高いことは、Py2 では保証されていないことに注意してください。たとえば、Jython と PyPy は、必要に応じて別の順序を使用する権利があります。保証されているのは、実行中のインタープリターの 1 つのコピー内での一貫性だけです。実際の順序は任意です。

于 2012-05-14T01:26:14.550 に答える
3

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')、最小でfloat('inf')かなり安全です。ただし、ループの外側で必ずキャッシュしてください。

def func():
   minval=float('-inf')
   for loop in now_you_can_loop:
       # otherwise float('-inf') is kinda slow
于 2012-05-14T04:43:52.550 に答える