Wie kann ich cmp (a, b) mit Python3 verwenden?

16

Mir wurde gesagt, dass die Verwendung der cmpFunktion im Code-Golf sehr nützlich sein kann . Leider hat Python 3 keine cmpFunktion.

Was ist das kürzeste Äquivalent dazu cmpin Python 3?

xaxa
quelle
3
Sie sollten klarstellen, dass Sie cmpim Zusammenhang mit Golfspielen nach einer Alternative suchen . Andernfalls wird dies möglicherweise sehr schnell als allgemeine Programmierfrage geschlossen.
Martin Ender
@ MartinBüttner Ich denke , das in Zusammenhang mit dem dem OP ist Golf Beratung Frage , wo eine Antwort verwendetcmp , obwohl die Frage für Python gefragt 3.
xnor
@ xnor Ich weiß, dass es ist, aber andere könnten nicht.
Martin Ender
Wenn es hilfreich ist zu wissen, können Sie cmp(a,b)in Python 2 verwenden.
mbomb007

Antworten:

34

Python 3 hat nicht cmp. Zum Golfen können Sie tun

11 Zeichen

(a>b)-(a<b)

das verliert 3 Zeichen über cmp(a,b).

Amüsanterweise ist dies auch eine "offizielle" Problemumgehung. Auf der Seite " Was ist neu in Python 3? " Wird Folgendes angezeigt: "(Wenn Sie die cmp()Funktionalität wirklich benötigen , können Sie den Ausdruck (a > b) - (a < b)als Entsprechung für verwenden cmp(a, b).)"

xnor
quelle
15
Vorsicht vor Prioritätsproblemen! Das tatsächliche Äquivalent von cmp (a, b) ist ((a> b) - (a <b))
Sparr
Wenn a oder b komplexere Ausdrücke sind, z. B. Aufrufe von Funktionen mit sehr langen Laufzeiten, ist dies sehr schlecht für Ihre Laufzeit. Schlimmer noch, wenn a oder b einen Aufruf einer Funktion mit Nebenwirkungen enthält, kann dies sogar die Semantik Ihres Programms ändern.
Algoman
1
@Algoman Oh nein, Laufzeit, der wichtigste Teil des Code-Golfens. Wenn Sie vermeiden möchten, dass Funktionen zweimal ausgeführt werden, weisen Sie sie zuvor nur Variablen zu (was Sie wahrscheinlich ohnehin tun werden , um Bytes zu sparen)
Jo King,
Ich arbeite an einem Transpiler - er liest einen Ausdruck und soll daraus einen Ausdruck erzeugen. Das cmp im ursprünglichen Ausdruck könnte tief verschachtelt sein. es wäre sehr hässlich und schwer (wenn nicht unmöglich) zu implementieren, wenn ich den Zielcode so generieren würde.
Algoman
1
@ Algoman Also austauschen cmp(exp1,exp2)mit (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Anders Kaseorg