¿Cómo puedo usar cmp (a, b) con Python3?

16

Me dijeron que usar la cmpfunción puede ser muy útil en code-golf . Pero desafortunadamente, Python 3 no tiene una cmpfunción.

Entonces, ¿cuál es el equivalente más corto de cmpeso funciona en Python 3?

xaxa
fuente
3
Debe aclarar que está buscando cmpo una alternativa en el contexto del golf. De lo contrario, esto podría cerrarse como una pregunta de programación general muy rápidamente.
Martin Ender
@ MartinBüttner Creo que esto está en el contexto de la pregunta de asesoramiento de golf del OP donde se utilizó una respuesta acmp pesar de que la pregunta pedía Python 3.
xnor
@xnor Sé que lo es, pero otros no.
Martin Ender
Si es útil saberlo, puede usarlo cmp(a,b)en Python 2.
mbomb007

Respuestas:

34

Python 3 no tiene cmp. Para jugar al golf, puedes hacer

11 caracteres

(a>b)-(a<b)

que pierde 3 caracteres más cmp(a,b).

Divertidamente, esta también es una solución "oficial". La página Novedades de Python 3 dice "(Si realmente necesita la cmp()funcionalidad, podría usar la expresión (a > b) - (a < b)como equivalente para cmp(a, b))".

xnor
fuente
15
¡Cuidado con los problemas de precedencia! el equivalente real de cmp (a, b) es ((a> b) - (a <b))
Sparr
si a o b son expresiones más complejas, digamos llamadas a funciones con tiempos de ejecución muy largos, entonces esto es muy malo para su tiempo de ejecución. Peor aún, si aob contiene una llamada a una función con efectos secundarios, esto puede incluso cambiar la semántica de su programa.
Algoman
1
@Algoman Oh, sí, el tiempo de ejecución, la parte más importante del código de golf / s. Si desea evitar ejecutar funciones dos veces, simplemente asígnelas de antemano a las variables (que probablemente terminará haciendo de todos modos para guardar en bytes)
Jo King
Estoy trabajando en un transpilador: lee una expresión y se supone que genera una expresión a partir de ella. Ese cmp en la expresión original podría estar profundamente anidado. sería muy feo y difícil de implementar (si no imposible), si tuviera que generar el código de destino de esa manera.
Algoman
1
@Algoman Así que reemplace cmp(exp1,exp2)con (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Anders Kaseorg