Quelle est la meilleure façon de créer une liste triée par ordre alphabétique en Python ?
mylist.sort(key=str.lower)
est plus rapide.
Quelle est la meilleure façon de créer une liste triée par ordre alphabétique en Python ?
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)
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.
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.
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.
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 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.
1 votes
Utilice
locale
et ses méthodes de collation des chaînes de caractères pour trier naturellement selon la locale courante.