Ordem Personalizada com functools.cmp_to_key
Escreva um comparador quando as chaves não forem suficientes.
Ordem Personalizada com functools.cmp_to_key é uma aula grátis de Competitive Programming Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Competitive Programming Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Competitive Programming Academy inclui 4 aulas no total.
Quando uma key não consegue expressar a ordem
Algumas ordens dependem de comparar dois itens entre si, não de avaliar cada um isoladamente. Nesses casos, escreva uma função comparadora em vez de usar uma key.
O que uma comparadora retorna
Uma comparadora recebe dois itens, a e b. Retorne um número negativo se a vier primeiro, um positivo se b vier primeiro e zero se houver empate.
def cmp(a, b):
if a < b: return -1
if a > b: return 1
return 0Faça a ponte com cmp_to_key
A ordenação do Python aceita apenas uma key, então envolva sua comparadora com functools.cmp_to_key para transformá-la em uma key utilizável.
from functools import cmp_to_key
items.sort(key=cmp_to_key(cmp))O problema clássico do maior número
Para juntar números na maior string possível, compare os pares verificando qual concatenação é maior. Uma key comum não consegue representar isso.
def cmp(a, b):
return (a + b < b + a) - (a + b > b + a)Entenda esse truque de comparação
A expressão retorna -1 quando a+b é a junção maior, então a é ordenado antes de b. Isso constrói o maior número possível.
nums = ["3", "30", "34"]
nums.sort(key=cmp_to_key(cmp))
print("".join(nums)) # 34330O sinal é o que importa
A ordenação considera apenas o sinal do resultado. Retornar -2 ou -100 funciona da mesma forma que -1, então não se preocupe com a magnitude exata.
Mantenha as comparadoras consistentes
Sua comparadora deve ser consistente: se a vence b e b vence c, então a deve vencer c. Contradições produzem uma ordem sem sentido.
Prefira key quando possível
Uma key é calculada uma vez por item, mas uma comparadora é executada para muitos pares e é mais lenta. Use cmp_to_key apenas quando uma key realmente não puder funcionar.
O atalho da subtração
Para comparações numéricas, você pode retornar a - b diretamente, pois o sinal já codifica a ordem. É curto e seguro para inteiros.
items.sort(key=cmp_to_key(lambda a, b: a - b))Cuidado com números de ponto flutuante
Com números de ponto flutuante, a - b pode ser arredondado para um valor muito pequeno ou para zero. Faça a comparação com ramificações explícitas para evitar empates incorretos.
Comparadoras permitem ordens personalizadas
Ordem de concatenação, classificações personalizadas e empates baseados em regras tornam-se possíveis. Uma comparadora é sua saída para ordenações complexas.
Verificação rápida
Sua comparadora retorna um número negativo para cmp(a, b).
Recapitulação
Você pode envolver uma comparadora com cmp_to_key para expressar ordens que uma key não consegue representar. Retorne um sinal, mantenha a consistência e prefira keys quando puder. 🧩
Perguntas Frequentes
A aula “Ordem Personalizada com functools.cmp_to_key” é grátis?
Sim — o texto completo de “Ordem Personalizada com functools.cmp_to_key” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Competitive Programming Academy, atualize para CoddyKit PRO. O curso de Competitive Programming Academy inclui 4 aulas no total.
O que vou aprender em “Ordem Personalizada com functools.cmp_to_key”?
Escreva um comparador quando as chaves não forem suficientes. Você pratica Competitive Programming Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Competitive Programming Academy?
Nenhuma experiência prévia é necessária. Competitive Programming Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Ordem Personalizada com functools.cmp_to_key”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Competitive Programming Academy?
Sim. Cada aula de Competitive Programming Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- sorted() e a Função key
- Ordene por Vários Campos
- Ordem Personalizada com functools.cmp_to_key
- Por que Ordenar Primeiro Desbloqueia Soluções