A documentação não garante isso. Existe algum outro local onde esteja documentado?
Eu estou supondo que pode ser estável, já que o método de classificação nas listas é garantidamente estável (Notas 9º ponto: "Começando com Python 2.3, o método sort () é garantido como estável") e classificado é funcionalmente semelhante. No entanto, não consigo encontrar nenhuma fonte definitiva que diga isso.
Objetivo: preciso classificar com base em uma chave primária e também em uma chave secundária nos casos em que a chave primária é igual em ambos os registros. Se ordenado () for estável, posso classificar a chave secundária e, em seguida, classificar a chave primária e obter o resultado de que preciso.
PS: Para evitar qualquer confusão, estou usando estável no sentido de "uma classificação é estável se garantir não alterar a ordem relativa dos elementos que comparam iguais".
fonte
sorted([(1, 2), (1, 1)])
retorna em[(1, 1), (1, 2)]
vez de retornar a entrada original na mesma sequência / ordem. A garantia de estabilidade não deveria significar que ele deveria retornar a[(1, 2), (1, 1)]
entrada original ? Nesse caso, você deve ser explícito e dizersorted([(1, 2), (1, 1)], key=lambda t: t[0])
key
parâmetro explicitamente.Eles são estáveis .
A propósito: às vezes você pode ignorar saber se a classificação e a classificação são estáveis, combinando uma classificação de várias passagens em uma de passagem única.
Por exemplo, se você quiser classificar os objetos com base em suas
last_name
,first_name
atributos, você pode fazê-lo em uma passagem:aproveitando a comparação de tupla.
Esta resposta, tal como está, cobre a pergunta original. Para outras questões relacionadas à classificação, há o Python Sorting How-To .
fonte
key= lambda item: (-item.rating, item.price)
ou forneça um emcmp
vez de umkey
argumento. Ainda não tenho certeza sobre o propósito do seu comentário, no entanto.A documentação mudou entretanto ( commit relevante ) e a documentação atual
sorted
garante explicitamente:Esta parte da documentação foi adicionada ao Python 2.7 e Python 3.4 (+), portanto, qualquer implementação compatível dessa versão da linguagem deve ter uma versão estável
sorted
.Observe que, para CPython, o
list.sort
é estável desde Python 2.3Não tenho 100% de certeza
sorted
, hoje em dia é simples de usarlist.sort
, mas não chequei o histórico disso. Mas é provável que "sempre" tenha sido usadolist.sort
.fonte
A documentação "O que há de novo" para Python 2.4 efetivamente mostra que o Sort () primeiro cria uma lista, então chama sort () nela, fornecendo a você a garantia de que você precisa, embora não esteja na documentação "oficial". Você também pode verificar a fonte, se estiver realmente preocupado.
fonte
O documento do Python 3.6 sobre classificação agora afirma que
Além disso, naquele documento, há um link para o Timsort estável , que afirma que
fonte