dictionnaire - trier une liste python sans sort




Comment trier une liste de chaînes? (5)

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


Mais comment cela gère-t-il les règles de tri spécifiques à la langue? Cela prend-il en compte les paramètres régionaux?

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


Il est également intéressant de noter la fonction sorted() :

for x in sorted(list):
    print x

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


Réponse de base:

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

Cela modifie votre liste d'origine (c'est-à-dire trie sur place). Pour obtenir une copie triée de la liste, sans modifier l'original, utilisez la fonction sorted() :

for x in sorted(mylist):
    print x

Cependant, les exemples ci-dessus sont un peu naïfs, car ils ne prennent pas en compte les paramètres régionaux et effectuent un tri sensible à la casse. Vous pouvez tirer parti de la key paramètre facultative pour spécifier l'ordre de tri personnalisé (l'alternative, en utilisant cmp , est une solution obsolète, car elle doit être évaluée plusieurs fois - la key n'est calculée qu'une seule fois par élément).

Donc, 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 en avez besoin, vous pouvez spécifier un environnement local personnalisé 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 sont faux pour toutes les données non-anglais:

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

Supposons que s = "ZWzaAd"

Pour trier la chaîne ci-dessus, la solution simple sera inférieure à un.

print ''.join(sorted(s))

list.sort()

C'est aussi simple que ça :)





sorting