Je ne cherche pas de solution. Vous cherchez à comprendre pourquoi Python trie de cette façon.
>>> a = ['aaa','Bbb'] >>> a.sort() >>> print(a) ['Bbb', 'aaa'] >>> a = ['aaa','bbb'] >>> a.sort() >>> print(a) ['aaa', 'bbb']
3 Réponses :
Ceci est dû au fait que les caractères majuscules ont une valeur ASCII inférieure à celle des minuscules. Et donc si nous les trions par ordre croissant, les majuscules viendront avant les minuscules
A
est 65 a
est 97 65 <97
Et donc A si vous triez par ordre croissant
str
est trié en fonction des valeurs d'octet brutes (Python 2) ou des valeurs ordinales Unicode (Python 3); en ASCII et Unicode, toutes les lettres majuscules ont des valeurs inférieures à toutes les lettres minuscules, elles sont donc triées avant elles:
>>> import locale >>> locale.setlocale(locale.LC_COLLATE, 'en_US.utf-8') >>> a.sort(key=locale.strxfrm) >>> a ['aaa', 'Bbb']
Certains paramètres régionaux (par exemple en_US
) changeront ce tri commande; si vous passez locale.strxfrm
comme key function , vous obtiendrez des tris insensibles à la casse sur ces paramètres régionaux, par exemple
>>> ord('A'), ord('Z') (65, 90) >>> ord('a'), ord('z') (97, 112)
str n'est pas une séquence d'octets sur Python 3. str est une séquence de points de code Unicode. Bien que les valeurs soient les mêmes dans la plage ascii.
@jfs: Vrai. J'aurais pu jurer que l'OP avait en quelque sorte marqué cela comme Python 2 spécifiquement, mais clairement pas; c'était peut-être une autre question que j'ai lue à peu près au même moment.
oui, la première révision de la question concerne spécifiquement Python 2.
Maintenant que nous avons vu techniquement pourquoi - je me demande encore pratiquement pourquoi quelqu'un voudrait cela?
Python traite les lettres majuscules comme inférieures aux lettres minuscules. Si vous souhaitez trier en ignorant la casse. Vous pouvez faire quelque chose comme ceci:
a = ['aaa','Bbb'] a.sort(key=str.lower) print(a) Outputs: ['aaa', 'Bbb']
Ce qui ignore la casse. Le paramètre clé "str.lower" est ce qui vous permet de faire cela. La documentation suivante devrait vous aider. https://docs.python.org/3/howto/sorting.html
Par défaut, il trie par valeur ASCII (ou valeur UNICODE pour les chaînes UNICODE) où les lettres majuscules ont des nombres plus petits que les lettres minuscules.
66 est inférieur à 97: D
@MichaelButscher "les lettres majuscules ont des nombres plus petits que les lettres minuscules" n'est pas vrai dans tout l'Unicode (même si vous essayez de créer des paires de formes inférieure et supérieure de la même lettre.). Matt, vous pouvez le considérer comme un ordre fixe et arbitraire puisque vous ne spécifiez aucune règles de tri de texte , comme comme via une locale.
Liste de tri des chaînes avec des paramètres régionaux spécifiques en python