web-dev-qa-db-fra.com

La fonction triée () de python est-elle garantie d'être stable?

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".

74
sundar

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!

96
Alex Martelli

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 .

23
tzot

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.

2
MSeifert

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.

0
Peter Hansen

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.

0
Wolfgang Kuehn