La documentation ne garantit pas cela. Y a-t-il un autre endroit documenté?
Je suppose que cela pourrait être stable puisque la méthode de tri sur les listes est garantie de stabilité (Notes 9ème point: "A partir de Python 2.3, la méthode sort () est garantie", et trié est fonctionnellement similaire. Cependant, je ne suis pas en mesure de trouver une source définitive qui le dit.
Objectif: Je dois effectuer un tri en fonction d'une clé primaire et d'une clé secondaire dans les cas où la clé primaire est identique dans les deux enregistrements. Si Trier () est garanti stable, je peux trier sur la clé secondaire, puis sur la clé primaire et obtenir le résultat dont j'ai besoin.
PS: Pour éviter toute confusion, j'utilise stable dans le sens où "une sorte est stable si elle garantit de ne pas modifier l'ordre relatif des éléments qui se comparent égaux".
Oui, le but de ce manuel est en effet de garantir que sorted
est stable et qu’il utilise le même algorithme que la méthode sort
. Je me rends bien compte que les docs ne sont pas parfaitement au courant de cette identité; les patchs doc sont toujours acceptés avec joie!
Ils sont stables .
En passant, vous pouvez parfois ignorer de savoir si le tri et le tri sont stables, en combinant un tri en plusieurs passes en un tri en un seul passage.
Par exemple, si vous souhaitez trier les objets en fonction de leurs attributs last_name
, first_name
, vous pouvez le faire en un seul passage:
sorted_list= sorted(
your_sequence_of_items,
key= lambda item: (item.last_name, item.first_name))
profitant de la comparaison des tuples.
Cette réponse, telle quelle, couvre la question initiale. Pour d'autres questions relatives au tri, consultez le fichier Comment faire pour trier Python .
La documentation a changé entre-temps ( pertinent commit ) et la documentation actuelle de sorted
le garantit explicitement:
La fonction
sorted()
intégrée est garantie d'être stable. Un tri est stable s'il garantit de ne pas modifier l'ordre relatif des éléments qui se comparent égaux - ceci est utile pour effectuer un tri en plusieurs passes (par exemple, tri par département, puis par classe salariale).
Cette partie de la documentation a été ajoutée à Python 2.7 et Python 3.4 (+), de sorte que toute implémentation compliant de cette version linguistique devrait avoir une stable sorted
.
Notez que pour CPython le list.sort
est stable depuis Python 2.3
- Tim Peters a réécrit son implémentation
list.sort()
- celle-ci est une "sorte stable" (des entrées égales apparaissent dans le même ordre dans la sortie) et plus rapide qu'avant.
Je ne suis pas sûr à 100% de sorted
; de nos jours, il utilise simplement list.sort
, mais je n'ai pas vérifié l'historique pour cela. Mais il est probable que "toujours" utilisé list.sort
.
Les "Quoi de neuf" de la documentation pour Python 2.4 indiquent de manière efficace quelass () commence par créer une liste, puis appelle sort () dessus, vous offrant ainsi la garantie dont vous avez besoin, mais pas dans la documentation "officielle". Vous pouvez également simplement vérifier la source, si cela vous préoccupe vraiment.
Le document Python 3.6 sur le tri indique maintenant que
Les types sont garantis pour être stable
De plus, dans ce document, il existe un lien vers le fichier stable Timsort , qui indique que
Timsort est l'algorithme de tri standard de Python depuis la version 2.3.