Como posso usar cmp (a, b) com Python3?

16

Foi-me dito que o uso da cmpfunção pode ser muito útil no código-golfe . Mas, infelizmente, o Python 3 não tem uma cmpfunção.

Então, qual é o menor equivalente cmpque funciona no python 3?

xaxa
fonte
3
Você deve esclarecer que está procurando cmpou uma alternativa no contexto do golfe. Caso contrário, isso pode ser encerrado como uma questão de programação geral muito rapidamente.
Martin Ender
@ MartinBüttner Eu acho que isso é no contexto do OP questão conselhos de golfe , onde uma resposta utilizadocmp embora a pergunta feita para Python 3.
xnor
@ xnor Eu sei que é, mas outros podem não.
Martin Ender
Se é útil saber, você pode usar cmp(a,b)em Python 2.
mbomb007

Respostas:

34

Python 3 não possui cmp. Para jogar golfe, você pode fazer

11 caracteres

(a>b)-(a<b)

que perde 3 caracteres cmp(a,b) .

Divertidamente, essa também é uma solução alternativa "oficial". A página O que há de novo no Python 3 diz "(Se você realmente precisa da cmp()funcionalidade, pode usar a expressão (a > b) - (a < b)como equivalente a cmp(a, b))."

xnor
fonte
15
cuidado com problemas de precedência! o equivalente real do CMP (a, b) é ((a> b) - (a <b))
Sparr
se a ou b são expressões mais complexas - digamos chamadas para funções com tempos de execução muito longos, isso é muito ruim para o seu tempo de execução. Pior, se a ou b contiver uma chamada para uma função com efeitos colaterais, isso poderá alterar a semântica do seu programa.
Algoman
1
@ Argoman Oh não, tempo de execução, a parte mais importante do código-golfe / s. Se você quiser evitar a execução de funções duas vezes, apenas atribuí-los a variáveis de antemão (que você provavelmente vai acabar fazendo de qualquer maneira de economizar em bytes)
Jo rei
Estou trabalhando em um transpiler - ele lê uma expressão e deve gerar uma expressão a partir dela. Esse cmp na expressão original pode ser aninhado profundamente. seria muito feio e difícil (se não impossível) de implementar, se eu gerasse o código de destino assim.
Algoman
1
@ Argoman Então substitua cmp(exp1,exp2)por (lambda a,b:(a>b)-(a<b))(exp1,exp2).
Anders Kaseorg