Estaba refactorizando un código antiguo mío y me encontré con esto:
alist.sort(cmp_items)
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
El código funciona (¡y lo escribí hace unos 3 años!), Pero no puedo encontrar esto documentado en ningún lugar de los documentos de Python y todos lo usan sorted()
para implementar la clasificación personalizada. ¿Alguien puede explicar por qué funciona esto?
sorted()
ysort()
ofrecer clasificación personalizada de la misma manera, modulo la diferencia en la convención de llamadas.key
se prefiere usar un parámetro a pasar unacmp
función. (El último ni siquiera está implementado en Python 3)foo
, de lo contrario explota. Es mejor definir un__lt__()
método personalizado para su clase, entoncessorted()
ylist.sort()
funcionará de inmediato. (Por cierto, los objetos ya no necesitan definirse__cmp__()
, solo__lt__()
. Vea estoRespuestas:
Está documentado aquí .
fuente
cmp
, obtengoTypeError: 'cmp' is an invalid keyword argument for this function
. ¿Que esta pasando aqui?sort
no toma una función de comparación como argumento en Python 3, y no como algo que realmente me gustaría hacer.Como nota al margen, aquí hay una mejor alternativa para implementar la misma clasificación:
O alternativamente:
Consulte el Cómo ordenar , es muy útil.
fuente
Como en este ejemplo. Quieres ordenar esta lista.
salida:
debe ordenar las tuplas por el segundo elemento, luego el primero:
Finalmente:
sólo
sort(letter_cmp)
fuente
Esto no funciona en Python 3.
Sin embargo, puede usar functools cmp_to_key para que funcionen las funciones de comparación de estilo antiguo.
fuente
En python3 puedes escribir:
fuente
Aun mejor:
Tomado de: https://docs.python.org/3/howto/sorting.html
fuente