La documentation ne le garantit pas. Y a-t-il un autre endroit où cela est documenté?
Je suppose que cela pourrait être stable puisque la méthode de tri sur les listes est garantie d'être stable (Notes 9e point: "À partir de Python 2.3, la méthode sort () est garantie d'être stable"), et trié est fonctionnellement similaire. Cependant, je ne suis pas en mesure de trouver une source définitive qui le dise.
Objectif: je dois trier en fonction d'une clé primaire et également d'une clé secondaire dans les cas où la clé primaire est égale dans les deux enregistrements. Si sorted () est garanti pour être stable, je peux trier sur la clé secondaire, puis trier sur la clé primaire et obtenir le résultat dont j'ai besoin.
PS: Pour éviter toute confusion, j'utilise stable dans le sens de "un tri est stable s'il garantit de ne pas changer l'ordre relatif des éléments qui se comparent égaux".
la source
sorted([(1, 2), (1, 1)])
renvoie[(1, 1), (1, 2)]
au lieu de renvoyer l'entrée d'origine dans la même séquence / ordre. La garantie de stabilité ne devrait-elle pas signifier qu'il devrait renvoyer l'[(1, 2), (1, 1)]
entrée d' origine ? Dans ce cas, vous devez être explicite et diresorted([(1, 2), (1, 1)], key=lambda t: t[0])
key
paramètre explicitement.Ils sont stables .
Au fait: vous pouvez parfois ignorer si le tri et le tri sont stables, en combinant un tri multi-passes dans un tri en un seul passage.
Par exemple, si vous voulez trier les objets en fonction de leurs
last_name
,first_name
attributs, vous pouvez le faire en un seul passage:tirant parti de la comparaison de tuple.
Cette réponse, telle quelle, couvre la question initiale. Pour d'autres questions liées au tri, il y a le guide de tri Python .
la source
key= lambda item: (-item.rating, item.price)
ou fournissezcmp
unkey
argument au lieu d'un argument. Cependant, je ne suis toujours pas sûr du but de votre commentaire.La documentation a changé entre-temps ( commit pertinent ) et la documentation actuelle de
sorted
le garantit explicitement:Cette partie de la documentation a été ajoutée à Python 2.7 et Python 3.4 (+), donc toute implémentation conforme de cette version du langage doit avoir un fichier stable
sorted
.Notez que pour CPython, le
list.sort
est stable depuis Python 2.3Je ne suis pas sûr à 100%
sorted
, de nos jours, c'est simplelist.sort
, mais je n'ai pas vérifié l'historique pour cela. Mais il est probable qu'il soit «toujours» utilisélist.sort
.la source
Les documents "What's New" pour Python 2.4 font effectivement le point que sorted () crée d'abord une liste, puis appelle sort () dessus, vous fournissant la garantie dont vous avez besoin mais pas dans la documentation "officielle". Vous pouvez également simplement vérifier la source, si vous êtes vraiment inquiet.
la source
La documentation Python 3.6 sur le tri indique maintenant que
En outre, dans ce document, il y a un lien vers l'écurie Timsort , qui indique que
la source