Come posso usare cmp (a, b) con Python3?


16

Mi è stato detto che l'uso della cmpfunzione può essere molto utile nel code-golf . Ma sfortunatamente, Python 3 non ha una cmpfunzione.

Quindi qual è l'equivalente più breve di cmpquello che funziona in Python 3?


3
Dovresti chiarire che stai cercando cmpo un'alternativa nel contesto del golf. Altrimenti, questo potrebbe chiudersi molto rapidamente come una domanda di programmazione generale.
Martin Ender,

@ MartinBüttner Penso che questo sia nel contesto della domanda di consigli sul golf dell'OP in cui una risposta è stata usatacmp anche se la domanda ha richiesto Python 3.
xnor

@xnor So che lo è, ma altri potrebbero non farlo.
Martin Ender,

Se è utile sapere, puoi usare cmp(a,b)in Python 2.
mbomb007

Risposte:


34

Python 3 non ha cmp. Per il golf, puoi farlo

11 caratteri

(a>b)-(a<b)

che perde 3 caratteri cmp(a,b).

In modo divertente, questa è anche una soluzione "ufficiale". La pagina Novità di Python 3 dice "(Se hai davvero bisogno della cmp()funzionalità, potresti usare l'espressione (a > b) - (a < b)come equivalente per cmp(a, b).)"


15
attenzione ai problemi di precedenza! l'equivalente effettivo di cmp (a, b) è ((a> b) - (a <b))
Sparr

se aob sono espressioni più complesse, ad esempio chiamate a funzioni con tempi di esecuzione molto lunghi, questo è molto negativo per il tempo di esecuzione. Peggio ancora, se aob contiene una chiamata a una funzione con effetti collaterali, ciò può persino cambiare la semantica del programma.
Algoman

1
@Algoman Oh noes, tempo di esecuzione, la parte più importante del gioco del golf. Se vuoi evitare di eseguire due volte le funzioni, assegnale in anticipo alle variabili (che probabilmente finirai comunque per risparmiare sui byte)
Jo King

Sto lavorando su un transpiler: legge un'espressione e si suppone che ne generi un'espressione. Quel cmp nell'espressione originale potrebbe essere annidato profondamente. sarebbe molto brutto e difficile (se non impossibile) implementarlo, se dovessi generare il codice target in quel modo.
Algoman

1
@Algoman Quindi sostituisci cmp(exp1,exp2)con (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Anders Kaseorg,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.