list.sort()
trie la liste et remplace la liste d'origine, tandis que sorted(list)
renvoie une copie triée de la liste, sans modifier la liste d'origine.
- Quand l'un est-il préféré à l'autre?
- Qu'est-ce qui est le plus efficace? De combien?
- Une liste peut-elle être remise à l'état non trié après
list.sort()
avoir été exécutée?
sorted()
un argument de chaîne mais pensez que c'est une liste, vous obtenez un résultat de liste, pas une chaîne :sorted("abcd", reverse=True)
donne['d', 'c', 'b', 'a']
pas"dcba"
Réponses:
sorted()
renvoie une nouvelle liste triée, laissant la liste d'origine inchangée.list.sort()
trie la liste sur place , mute les index de la liste et renvoieNone
(comme toutes les opérations sur place).sorted()
fonctionne sur tout itérable, pas seulement sur des listes. Chaînes, tuples, dictionnaires (vous obtiendrez les clés), générateurs, etc., renvoyant une liste contenant tous les éléments, triés.À utiliser
list.sort()
lorsque vous souhaitez modifier la liste,sorted()
lorsque vous souhaitez récupérer un nouvel objet trié. Utilisezsorted()
lorsque vous voulez trier quelque chose qui est un itératives, pas une liste encore .Pour les listes,
list.sort()
c'est plus rapide quesorted()
parce qu'il n'est pas nécessaire de créer une copie. Pour tout autre itérable, vous n'avez pas le choix.Non, vous ne pouvez pas récupérer les positions d'origine. Une fois que vous avez appelé,
list.sort()
la commande d'origine est partie.la source
None
, c'est un signe, que les opérations sont effectuées sur place, c'est pourquoi, lorsque vous souhaitez imprimerlist.sort()
elle retourne None.list.sort
mute la liste sur place et retourneNone
sorted
prend tout itérable et renvoie une nouvelle liste, triée.sorted
est équivalent à cette implémentation Python, mais la fonction intégrée CPython devrait s'exécuter beaucoup plus rapidement car elle est écrite en C:list.sort
lorsque vous ne souhaitez pas conserver l'ordre de tri d'origine (vous pourrez ainsi réutiliser la liste en place en mémoire.) Et lorsque vous êtes l'unique propriétaire de la liste (si la liste est partagée par un autre code et que vous muter, vous pourriez introduire des bogues là où cette liste est utilisée.)sorted
lorsque vous souhaitez conserver l'ordre de tri d'origine ou lorsque vous souhaitez créer une nouvelle liste que seul votre code local possède.Non - sauf si vous avez fait une copie vous-même, ces informations sont perdues car le tri est effectué sur place.
Pour illustrer la peine de créer une nouvelle liste, utilisez le module timeit, voici notre configuration:
Et voici nos résultats pour une liste de 10000 entiers arrangés aléatoirement, comme nous pouvons le voir ici, nous avons réfuté un ancien mythe des dépenses de création de liste :
Python 2.7
Python 3
Après quelques retours, j'ai décidé qu'un autre test serait souhaitable avec des caractéristiques différentes. Ici, je fournis la même liste aléatoire de 100 000 fois pour chaque itération 1 000 fois.
J'interprète la différence de ce type plus large provenant de la copie mentionnée par Martijn, mais elle ne domine pas au point indiqué dans la réponse plus ancienne plus populaire ici, ici l'augmentation du temps n'est que d'environ 10%
J'ai également exécuté ce qui précède sur une sorte beaucoup plus petite, et j'ai vu que la nouvelle
sorted
version de copie prend encore environ 2% de plus de temps d'exécution sur une sorte de longueur 1000.Poke a également exécuté son propre code, voici le code:
Il a trouvé pour un tri de longueur 1000000 (exécuté 100 fois) un résultat similaire, mais seulement une augmentation d'environ 5% du temps, voici le résultat:
Conclusion:
Une liste de grande taille triée avec
sorted
une copie dominera probablement les différences, mais le tri lui-même domine l'opération, et organiser votre code autour de ces différences serait une optimisation prématurée. J'utiliseraissorted
quand j'ai besoin d'une nouvelle liste triée des données, et j'utiliseraislist.sort
quand j'ai besoin de trier une liste sur place, et laisser cela déterminer mon utilisation.la source
sorted()
faut allouer un nouvel objet liste et copier les références; le reste des chemins de code sont identiques. Voyez si vous pouvez exécuter les mêmes tests avec des listes plus grandes. Comparez-le avec la simple création de copies de listes et voyez si vous pouvez reproduire les différences que vous avez trouvées, etc.La principale différence est que
sorted(some_list)
renvoie un nouveaulist
:et
some_list.sort()
, trie la liste en place :Notez que puisque
a.sort()
ne renvoie rien,print a.sort()
imprimeraNone
.Une liste de positions d'origine peut-elle être récupérée après list.sort ()?
Non, car cela modifie la liste d'origine.
la source
print a.sort()
n'imprimera rien.None
, je vais clarifier cela.La fonction .sort () stocke la valeur de la nouvelle liste directement dans la variable de liste; la réponse à votre troisième question serait donc NON. De plus, si vous faites cela en utilisant trié (liste), vous pouvez l'utiliser car il n'est pas stocké dans la variable de liste. Parfois aussi, la méthode .sort () agit comme une fonction ou dit qu'elle contient des arguments.
Vous devez stocker la valeur de trié (liste) dans une variable de manière explicite.
Aussi pour le traitement de données court, la vitesse n'aura aucune différence; mais pour de longues listes; vous devez utiliser directement la méthode .sort () pour un travail rapide; mais encore une fois, vous serez confronté à des actions irréversibles.
la source
list.sort()
méthode trie l'objet de liste sur place..sort()
méthode prend un argument et agit comme une fonction. Nous l'appelons également méthode car il s'agit d'un attribut de type de données liste.Voici quelques exemples simples pour voir la différence en action:
Consultez la liste des numéros ici:
Lors de l'appel
sorted
sur cette liste,sorted
fera une copie de la liste. (Cela signifie que votre liste d'origine restera inchangée.)Voyons voir.
Retour
Regardant à
nums
nouveauNous voyons la liste d'origine (inchangée et NON triée).
sorted
n'a pas changé la liste d'originePrendre la même
nums
liste et y appliquer lasort
fonction changera la liste actuelle.Voyons voir.
En commençant par notre
nums
liste pour vous en assurer, le contenu est toujours le même.Maintenant, la liste nums originale est changée et en regardant nums, nous voyons que notre liste originale a changé et est maintenant triée.
la source
sort () ne renvoie aucune valeur.
La méthode sort () trie simplement les éléments d'une liste donnée dans un ordre spécifique - croissant ou décroissant sans renvoyer aucune valeur.
La syntaxe de la méthode sort () est:
la source