Comment puis-je utiliser cmp (a, b) avec Python3?

16

On m'a dit que l'utilisation de la cmpfonction peut être très utile dans le code-golf . Mais malheureusement, Python 3 n'a pas de cmpfonction.

Alors, quel est l'équivalent le plus court de cmpcela fonctionne en python 3?

xaxa
la source
3
Vous devez préciser que vous recherchez cmpou une alternative dans le contexte du golf. Sinon, cela pourrait se fermer très rapidement en tant que question de programmation générale.
Martin Ender
@ MartinBüttner Je pense que c'est dans le contexte de la question des conseils de golf de l'OP où une réponse a été utiliséecmp bien que la question posée pour Python 3.
xnor
@xnor Je sais que oui, mais d'autres non.
Martin Ender
S'il est utile de le savoir, vous pouvez l'utiliser cmp(a,b)en Python 2.
mbomb007

Réponses:

34

Python 3 n'a pas cmp. Pour le golf, vous pouvez faire

11 caractères

(a>b)-(a<b)

qui perd plus de 3 caractères cmp(a,b).

De manière amusante, il s'agit également d'une solution de contournement "officielle". La page Quoi de neuf dans Python 3 indique "(Si vous avez vraiment besoin de la cmp()fonctionnalité, vous pouvez utiliser l'expression (a > b) - (a < b)comme équivalent pour cmp(a, b).)"

xnor
la source
15
méfiez-vous des problèmes de priorité! l'équivalent réel de cmp (a, b) est ((a> b) - (a <b))
Sparr
si a ou b sont des expressions plus complexes - dites des appels à des fonctions avec des temps d'exécution très longs, alors c'est très mauvais pour votre temps d'exécution. Pire, si a ou b contient un appel à une fonction avec des effets secondaires, cela peut même changer la sémantique de votre programme.
Algoman
1
@Algoman Oh non, le temps d'exécution, la partie la plus importante du code-golf / s. Si vous voulez éviter d'exécuter des fonctions deux fois, affectez-les simplement aux variables au préalable (ce que vous allez probablement finir par faire de toute façon pour économiser des octets)
Jo King
Je travaille sur un transpilateur - il lit une expression et est censé en générer une expression. Ce cmp dans l'expression originale pourrait être imbriqué profondément. ce serait très moche et difficile (sinon impossible) à implémenter, si je devais générer le code cible comme ça.
Algoman
1
@Algoman Alors remplacez cmp(exp1,exp2)par (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Anders Kaseorg