Eu estava refatorando um código antigo meu e me deparei com isto:
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
O código funciona (e eu o escrevi há cerca de 3 anos!), Mas não consigo encontrar isso documentado em nenhum lugar nos documentos do Python e todo mundo usa sorted()
para implementar classificação personalizada. Alguém pode explicar por que isso funciona?
sorted()
esort()
oferecem classificação personalizada da mesma maneira, modulo a diferença na convenção de chamada.key
parâmetro é preferível a passar umacmp
função. (O último nem mesmo é implementado em Python 3)foo
, caso contrário, ele explode. Melhor para definir um personalizado__lt__()
método para a sua classe, em seguida,sorted()
elist.sort()
vai funcionar out-of-the-box. (A propósito, os objetos não precisam mais ser definidos__cmp__()
, apenas__lt__()
. Veja istoRespostas:
Está documentado aqui .
fonte
cmp
, consigoTypeError: 'cmp' is an invalid keyword argument for this function
. O que está acontecendo aqui?sort
uma função de comparação não é considerada como argumento no Python 3, e não como algo que eu realmente gostaria de fazer.Como observação lateral, aqui está uma alternativa melhor para implementar a mesma classificação:
Ou alternativamente:
Confira o Guia de Classificação , é muito útil.
fonte
Assim como este exemplo. Você quer classificar esta lista.
resultado:
você deve classificar as tuplas pelo segundo item, depois o primeiro:
Finalmente:
somente
sort(letter_cmp)
fonte
Isso não funciona no Python 3.
Você pode usar functools cmp_to_key para que as funções de comparação do estilo antigo funcionem.
fonte
Em python3, você pode escrever:
fonte
Melhor ainda:
Retirado de: https://docs.python.org/3/howto/sorting.html
fonte