Comment trier une liste de chaînes de caractères ?

Quelle est la meilleure façon de créer une liste triée par ordre alphabétique en Python ?

Solution

Réponse de base :

mylist = ["b", "C", "A"]
mylist.sort()

Cette fonction modifie votre liste d'origine (c'est-à-dire qu'elle trie en place). Pour obtenir une copie triée de la liste, sans modifier l'original, utilisez la fonction [sorted()][1] :

for x in sorted(mylist):
    print x

Cependant, les exemples ci-dessus sont un peu naïfs, car ils ne tiennent pas compte de la locale, et effectuent un tri sensible à la casse. Vous pouvez tirer parti du paramètre optionnel key pour spécifier un ordre de tri personnalisé (l'alternative, l'utilisation de cmp, est une solution dépréciée, car elle doit être évaluée plusieurs fois - key n'est calculée qu'une fois par élément).

Donc, pour trier selon la locale courante, en prenant en compte les règles spécifiques à la langue ([cmp_to_key][2] est une fonction d'aide de functools) :

sorted(mylist, key=cmp_to_key(locale.strcoll))

Enfin, si vous le souhaitez, vous pouvez spécifier une [locale personnalisée][3] pour le tri :

import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert sorted((u'Ab', u'ad', u'aa'),
  key=cmp_to_key(locale.strcoll)) == [u'aa', u'Ab', u'ad']

Dernière remarque : vous verrez des exemples de tri insensible à la casse qui utilisent la méthode lower() - ceux-ci sont incorrects, car ils ne fonctionnent que pour le sous-ensemble de caractères ASCII. Ces deux méthodes sont incorrectes pour toutes les données non anglaises :

# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)

[1] : http://docs.python.org/library/functions.html#sorted [2] : http://docs.python.org/library/functools.html#functools.cmp_to_key [3] : http://docs.python.org/library/locale.html

Commentaires (8)
list.sort()

C'est vraiment aussi simple que cela :)

Commentaires (0)

Mais comment ce système gère-t-il les règles de tri spécifiques à une langue ? Prend-il en compte les paramètres locaux ?

Non, list.sort() est une fonction de tri générique. Si vous voulez trier selon les règles Unicode, vous devrez définir une fonction de clé de tri personnalisée. Vous pouvez essayer d'utiliser le module pyuca, mais je ne sais pas s'il est complet.

Commentaires (0)