1
votes

Confusion avec list.sort () en python

Considérons deux listes:

[-5, -4, -3]
['-3', '-4', '-5']`

Maintenant, si nous utilisons

list1.sort()
list2.sort() # in python3 

Nous obtenons des résultats contradictoires:

list1=[-4,-5,-3]
list2=['-4','-5','-3']

Pourquoi en est-il ainsi et comment pouvons-nous le faire correctement?


2 commentaires

En effet, dans un cas, vous triez des entiers dans les autres cas, vous triez des chaînes. Veuillez être plus précis sur la façon dont vous appelez correctement afin que nous puissions vous aider.


La deuxième liste trie lexicographiquement, ce qui signifie en bref, que les éléments sont triés "par lettre" lorsqu'ils contiennent le même suffixe. C'est pourquoi "ab" vient après "aa" et "-4" vient après "-3".


4 Réponses :


0
votes

Eh bien, ce sont deux tableaux avec des contenus différents. List1 est un tableau avec des nombres, List2 est un tableau de chaînes. C'est pourquoi ils ne trient pas de la même manière.


0 commentaires

8
votes

Le tri list1 est assez explicite car il ne fait que trier les nombres numériquement.

Dans list2 les valeurs sont stockées sous forme de chaînes. Il s'agit donc de les comparer et de les trier par la valeur ASCII. Le chiffre 3 a une valeur ASCII de 51, 4 a une valeur de 52 et 5 a une valeur de 53. Donc, il fonctionne parfaitement correctement, si vous voulez trier les mots, c'est ainsi que vous voulez le faire. p>

Cependant, si vous souhaitez simplement trier les chiffres dans le bon ordre, assurez-vous qu'ils sont int comme list1 . Ou vous pouvez définir la clé dans la méthode de tri pour les convertir en int s afin qu'elle soit triée de la manière numérique comme ceci:

list2.sort(key=int)


3 commentaires

Ou, si vous souhaitez trier les chaînes qui représentent des entiers comme elles le seraient si elles étaient des entiers, vous pouvez ajouter le paramètre key à .sort () : .sort (clé = int) . Cela les convertira implicitement en entiers lors du tri sans modifier la liste elle-même.


... et le '-' sont tous ignorés car ils sont identiques dans chaque chaîne.Vous pouvez forcer python à comparer les chaînes comme des entiers en utilisant key : list2.sort (key = int)


J'ai édité ma réponse, c'est une manière assez décente de le faire.



1
votes
  • Pourquoi en est-il ainsi?

Vous pouvez vérifier que '-3' <'-4' . La compression de chaîne vérifie les premiers symboles '-' == '-' , vérifie le deuxième symbole '3' <'4' , donc '-3' <'- 4 '.

  • Comment pouvons-nous faire les choses correctement?

Cela dépend de ce que vous appelez juste . Si vous voulez trier des entiers, Python le fait correctement. Si vous voulez trier une chaîne, Python le fait aussi correctement.


0 commentaires

2
votes

Les éléments de la liste [-4, -5, -3] sont des nombres alors que les éléments de la liste ['-4', '- 5', '- 3'] < / code> sont des chaînes (car les nombres dans la liste sont entre 'single_qoutes').

Donc, la raison d'obtenir des résultats contradictoires est que lorsque vous triez des nombres, vous récupérez [-5, -4, -3] , qui est trié par valeur numérique < / em>.

Lorsque vous triez l'autre liste avec des chaînes, il la trie par par ordre alphabétique où 3, 4 et 5 seraient corrects ('-' est le premier caractère et 3, 4 et 5 sont les caractères après.) pour le trier en fonction de sa valeur ASCII.

Donc, si vous voulez trier des entiers, ne les incluez pas entre guillemets.


0 commentaires