2012-10-17 2 views
4

pourquoi python donne une sortie comme ceci:comparaison de chaînes Python avec le cas différent et flotteur

>>> 'apple' > 'T' 
True 
>>> 'apple' > 't' 
False 

Il devrait être vrai pour les deux cases.right?

Edit:

J'ai eu l'idée de Table.Thanks ASCII !!

Maintenant, qu'en est-il de ce.Is 11.1 est traité comme '11 .1 '?

>>> 'apple' > 11.1 
True 
+0

Est-ce que vous posez cette question parce que certaines données n'ont pas trié comme prévu? Si c'est le cas, vous pouvez passer une clé à la fonction de tri afin que la casse soit normalisée: 'my_strings.sort (key = str.upper)'. –

+0

J'ai édité ma réponse pour inclure une brève réponse à la question que vous avez éditée. Si vous avez plus de questions sur comment cette conversion fonctionne, je vous recommande de lire le lien que j'ai fourni et de commencer une nouvelle question si vous en avez un. – Wilduck

Répondre

6

L'idée clé ici est que la comparaison de chaînes ne se compare pas en fonction de l'ordre alphabétique ou de tout ordre naturel, mais plutôt de l'ordre des caractères en ASCII. Vous pouvez voir cette commande dans un ASCII table. Python compare le premier caractère de chaque chaîne, et s'il est le même, il passe au suivant. Il le fera jusqu'à ce que les caractères diffèrent, ou qu'une chaîne soit épuisée (auquel cas la chaîne la plus longue sera considérée comme plus grande).

Comme cdhowie a souligné, dans un codage ASCII décimal T est 84, a est 97, et t est 116. Par conséquent:

>>> 'T' < 'a' < 't' 
True 

Pour montrer notre deuxième point:

>>> "apple" > "a" 
True 

Pour obtenir une comparaison plus naturelle voir: Does Python have a built in function for string natural sort?

Pour répondre à la question que vous avez ajoutée lors d'un montage:

La réponse simple est "oui". Une conversion de 11.1 en '11.1' est en cours.

La réponse la plus compliquée concerne comment exactement la comparaison est implémentée en python. Les objets Python peuvent être comparés s'ils implémentent le Comparison magic methods. Il y a une bonne quantité de lecture que vous pouvez faire au sujet des internes Python dans ce lien. Comme @glibdup l'a souligné, ce qui précède est incorrect.

En python différents types sont compared based on the name of their type. Ainsi, puisque 'str' > 'float' n'importe quelle chaîne sera plus grande que n'importe quel flotteur. Alternativement, n'importe quel tuple sera plus grand que n'importe quelle chaîne.

+0

Dans la question liée, l'OP voulait que les nombres à l'intérieur d'une chaîne soient interprétés comme des nombres, de sorte que ''example22' 'serait trier après'' example7''. Je ne pense pas que ce soit pertinent ici. –

+1

@StevenRumbalski Assez vrai. Je suppose que mon point en incluant ce lien était plus d'allusion à un nom pour ce que le PO pourrait rechercher. Si c'est effectivement un problème que le PO doit résoudre, et pas seulement une question de curiosité académique, sachant que l'expression «nature naturelle» pourrait être un bon début. Jeff Atwood a un poste assez décent sur le problème (reconnaissant toujours traiter des nombres pour la plupart) http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html . – Wilduck

+2

Assez juste. Dans la plupart des cas 'my_list.sort (key = str.upper)' sera probablement assez naturel pour les attentes. –

8

Parce que a vient après T dans le jeu de caractères ASCII, mais avant t.

Le codage ASCII décimal de ces lettres:

  • T est 84.
  • a est 97.
  • t est 116.