0Pricing
Competitive Programming Academy · Aula

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 0

Faç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))   # 34330

O 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

  1. sorted() e a Função key
  2. Ordene por Vários Campos
  3. Ordem Personalizada com functools.cmp_to_key
  4. Por que Ordenar Primeiro Desbloqueia Soluções
← Voltar para Competitive Programming Academy