Orden personalizado con functools.cmp_to_key
Escriba un comparador cuando las claves no basten
Orden personalizado con functools.cmp_to_key es una lección gratuita de Competitive Programming Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Competitive Programming Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Competitive Programming Academy incluye 4 lecciones en total.
Cuando una clave no puede expresarlo
Algunos órdenes dependen de comparar dos elementos entre sí, no un valor de cada uno. En esos casos, escriba una función comparadora en lugar de una key.
Qué devuelve una comparadora
Una comparadora recibe dos elementos, a y b. Devuelva un número negativo si a va primero, uno positivo si b va primero y cero si empatan.
def cmp(a, b):
if a < b: return -1
if a > b: return 1
return 0Conéctela mediante cmp_to_key
El ordenamiento de Python solo acepta una key, así que envuelva su comparadora con functools.cmp_to_key para convertirla en una key utilizable.
from functools import cmp_to_key
items.sort(key=cmp_to_key(cmp))El problema clásico del número más grande
Para unir números y formar la cadena más grande, compare los pares según cuál concatenación sea mayor. Una key normal no puede expresar esto.
def cmp(a, b):
return (a + b < b + a) - (a + b > b + a)Entienda ese truco de comparación
La expresión devuelve -1 cuando a+b forma la concatenación mayor, por lo que a se ordena antes que b. Así se construye el número más grande posible.
nums = ["3", "30", "34"]
nums.sort(key=cmp_to_key(cmp))
print("".join(nums)) # 34330Lo que importa es el signo
El ordenamiento solo lee el signo del resultado. Devolver -2 o -100 tiene el mismo efecto que devolver -1, así que no se preocupe por la magnitud exacta.
Mantenga coherentes las comparadoras
Su comparadora debe ser coherente: si a vence a b y b vence a c, entonces a debe vencer a c. Las contradicciones producen un orden incorrecto.
Prefiera key cuando sea posible
La key se calcula una vez por elemento, pero una comparadora se ejecuta sobre muchos pares y es más lenta. Use cmp_to_key solo cuando una key realmente no pueda funcionar.
El atajo de la resta
Para comparaciones numéricas, puede devolver directamente a - b, ya que su signo codifica el orden. Es breve y seguro para enteros.
items.sort(key=cmp_to_key(lambda a, b: a - b))Tenga cuidado con los flotantes
Con números de punto flotante, a - b puede redondearse a un valor diminuto o a cero. Compare mediante ramas explícitas para evitar empates incorrectos.
Las comparadoras permiten órdenes personalizados
El orden de concatenación, las clasificaciones personalizadas y los empates basados en reglas se vuelven posibles. Una comparadora es la solución para los ordenamientos complejos.
Comprobación rápida
Su comparadora devuelve un número negativo para cmp(a, b).
Resumen
Puede envolver una comparadora con cmp_to_key para expresar órdenes que una key no puede representar. Devuelva un signo, mantenga la coherencia y prefiera las keys cuando sea posible. 🧩
Preguntas frecuentes
¿La lección «Orden personalizado con functools.cmp_to_key» es gratis?
Sí — el texto completo de «Orden personalizado con functools.cmp_to_key» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Competitive Programming Academy, actualiza a CoddyKit PRO. El curso de Competitive Programming Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Orden personalizado con functools.cmp_to_key»?
Escriba un comparador cuando las claves no basten Practicas Competitive Programming Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Competitive Programming Academy?
No se requiere experiencia previa. Competitive Programming Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Orden personalizado con functools.cmp_to_key»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Competitive Programming Academy?
Sí. Cada lección de Competitive Programming Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- sorted() y la función key
- Ordene por varios campos
- Orden personalizado con functools.cmp_to_key
- Por qué ordenar primero desbloquea soluciones