474 votes

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 ?

1 votes

Utilice locale et ses méthodes de collation des chaînes de caractères pour trier naturellement selon la locale courante.

567voto

Eli Courtwright Points 53071

Réponse de base :

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

Cette opération modifie votre liste originale (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() función:

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 facultatif key pour spécifier l'ordre de tri personnalisé (l'alternative, l'utilisation de l'option cmp est une solution obsolète, car elle doit être évaluée plusieurs fois. key n'est calculée qu'une fois par élément).

Ainsi, pour trier en fonction de la locale actuelle, en tenant compte des règles spécifiques à la langue ( cmp_to_key est une fonction d'aide de functools) :

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

Et enfin, si vous le souhaitez, vous pouvez spécifier un locale personnalisée 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 l'option lower() Ces méthodes sont incorrectes, car elles 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)

41 votes

mylist.sort(key=str.lower) est plus rapide.

2 votes

Bonne remarque. Je vais laisser mon exemple actuel tel quel, car il est probablement plus facile pour un débutant de voir ce qui se passe, mais je garderai cela à l'esprit à l'avenir.

1 votes

Si quelqu'un est curieux, on peut trouver les performances de list.sort() aquí

61voto

Greg Hewgill Points 356191

Il convient également de noter que sorted() función:

for x in sorted(list):
    print x

Cela renvoie une nouvelle version triée d'une liste sans modifier la liste originale.

40voto

rix0rrr Points 4924
list.sort()

C'est vraiment aussi simple que cela :)

19voto

schmichael Points 303

La façon correcte de trier les chaînes de caractères est :

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'), cmp=locale.strcoll) == [u'aa', u'Ab', u'ad']

# Without using locale.strcoll you get:
assert sorted((u'Ab', u'ad', u'aa')) == [u'Ab', u'aa', u'ad']

L'exemple précédent de mylist.sort(key=lambda x: x.lower()) fonctionnera bien pour les contextes uniquement ASCII.

8voto

John Millikin Points 86775

Mais comment cela 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 la fonction pyuca mais je ne sais pas s'il est complet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X