Je vois que les réponses ont déjà fait un excellent travail, je voulais juste souligner une inefficacité de codage dans Triage humain . Pour appliquer une traduction sélective caractère par caractère à une chaîne unicode s, il utilise le code :
spec_dict = {'Å':'A', 'Ä':'A'}
def spec_order(s):
return ''.join([spec_dict.get(ch, ch) for ch in s])
Python dispose d'une méthode bien meilleure, plus rapide et plus concise pour effectuer cette tâche auxiliaire (sur les chaînes Unicode -- la méthode analogue pour les chaînes d'octets a une spécification différente et un peu moins utile!-) :
spec_dict = dict((ord(k), spec_dict[k]) for k in spec_dict)
def spec_order(s):
return s.translate(spec_dict)
Le dict que vous passez au translate
a des ordinaux Unicode (et non des chaînes de caractères) comme clés, c'est pourquoi nous avons besoin de cette étape de reconstruction de la méthode originale char-to-char spec_dict
. (Les valeurs dans le dict que vous passez pour traduire [par opposition aux clés, qui doivent être des ordinaux] peuvent être des ordinaux Unicode, des chaînes Unicode arbitraires, ou None pour supprimer le caractère correspondant dans le cadre de la traduction, il est donc facile de spécifier "ignorer un certain caractère à des fins de tri", "faire correspondre ä à ae à des fins de tri", et ainsi de suite).
En Python 3, vous pouvez obtenir l'étape de "reconstruction" plus simplement, par ex :
spec_dict = ''.maketrans(spec_dict)
Ver les docs pour d'autres façons d'utiliser cet outil maketrans
méthode statique en Python 3.
12 votes
Notez que cela dépend encore plus de la localité : En suédois (comme vous le dites), "Ä" vient après "Z", mais en allemand, "Ä" est généralement trié comme "AE".
0 votes
@Georg : Y a-t-il une raison pour laquelle vous avez ouvert une prime sur ce sujet ? Le site
locale.strcoll
La réponse est correcte lorsque vous avez besoin d'un tri Unicode utilisant la locale de l'utilisateur, et l'ICU répond à ce que vous voulez lorsque vous avez besoin de plus que cela (collation utilisant plus d'une locale). La plupart du temps, vous voulezlocale.strcoll
.0 votes
@Glenn : Je voulais savoir à quel point
locale.strcoll
et surtout ce que UNITÉ DE SOINS INTENSIFS fait mieux que la fonction Python. En gros, un peu plus d'attention pour la question.1 votes
@Georg : J'ai beaucoup joué avec l'algorithme de collation d'Unicode ces derniers temps, comme vous pouvez le voir dans ma réponse. C'est vraiment excellent de pouvoir, par exemple, trier sur
--locale=de__phonebook
quand vous en aurez besoin. Le module Perl passe la suite de tests de l'UCA, et le script que j'ai fourni permet de jouer beaucoup plus facilement avec l'ensemble de l'UCA et toutes ses options. y compris les locales, juste à partir de la ligne de commande. Ne répond pas forcément el mais cela devrait tout de même être très intéressant. Si vous êtes en Suisse, je suis sûr que la flexibilité vous sera utile :)