Python3でcmp(a、b)を使用するにはどうすればよいですか?


16

cmp関数を使用することはcode-golfで非常に役立つと言われました。しかし、残念ながら、Python 3にはcmp機能がありません。

それではcmp、Python 3で動作する最短の等価物は何ですか?


3
あなたが探しているcmpか、ゴルフの文脈で代替案を明確にする必要があります。そうでなければ、これは一般的なプログラミングの質問として非常に迅速に終了する可能性があります。
マーティンエンダー

@MartinBüttnerこれはOPのゴルフアドバイスの質問のコンテキストにあると思います。質問はPython 3を求めていましたが、答えが使用されてcmpいました。
xnor15年

@xnor私はそれが知っているが、他の人はそうではないかもしれない。
マーティンエンダー

知っておくと役立つ場合はcmp(a,b)、Python 2で使用できます
。– mbomb007

回答:


34

Python 3にはがありませんcmp。ゴルフのために、次のことができます

11文字

(a>b)-(a<b)

3文字を失いcmp(a,b)ます。

面白いことに、これは「公式の」回避策でもあります。「Python 3の新cmp()機能」ページには、「(機能が本当に必要な場合は、式(a > b) - (a < b)をに相当するものとして使用できますcmp(a, b)。)」


15
優先順位の問題に注意してください!cmp(a、b)の実際の同等物は((a> b)-(a <b))
15年

aまたはbがより複雑な式である場合-実行時間が非常に長い関数の呼び出しなど、実行時間にとって非常に悪いです。さらに悪いことに、aまたはbに副作用のある関数の呼び出しが含まれていると、プログラムのセマンティクスを変更することさえできます。
アルゴマン

1
@Algomanおっと、実行時間、コードゴルフの最も重要な部分/ s。あなたが二回の関数を実行しないようにしたい場合は、単に(おそらくやって終わるつもり事前に変数に割り当てるとにかくバイトを節約するために)
ジョー・キング

私はトランスパイラーに取り組んでいます-式を読み取り、それから式を生成することになっています。元の式のcmpは深くネストできます。そのようなターゲットコードを生成する場合、実装するのは非常にくて(不可能ではないにしても)難しいでしょう。
アルゴマン

1
@Algomanので、交換してくださいcmp(exp1,exp2)(lambda a,b:(a>b)-(a<b))(exp1,exp2)
アンデルスカセオルグ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.