2008-08-30 11 views
299

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

+1

Utilisez 'locale' et pour les méthodes de classement de chaîne pour trier naturellement selon les paramètres régionaux en cours. – u0b34a0f6ae

Répondre

384

réponse de base:

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

Ceci modifie votre liste d'origine (à savoir sortes en place). Pour obtenir une copie de la liste triée, sans modifier l'original, utilisez la fonction sorted():

for x in sorted(mylist): 
    print x 

Cependant, les exemples ci-dessus un peu naïve, car ils ne prennent pas en compte locale, et effectuer un cas tri sélectif Vous pouvez tirer parti du paramètre facultatif key 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 - key n'est calculée qu'une seule fois par élément).

Donc, pour trier selon les paramètres régionaux en cours, en prenant des règles spécifiques à la langue en compte (cmp_to_key est une fonction d'aide de functools):

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

Et enfin, si vous avez besoin, vous pouvez spécifier un custom locale 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 note: vous verrez des exemples de tri insensible à la casse qui utilisent la méthode lower() - ceux qui sont incorrectes, car ils ne fonctionnent que pour le sous-ensemble ASCII de caractères. Ces deux sont mauvais pour 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) 
+33

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

+0

Bon point. 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 dans le futur. –

+1

Si quelqu'un est curieux, les performances de list.sort() peuvent être trouvées [ici] (http://stackoverflow.com/questions/1517347/about-pythons-built-in-sort-method) –

32
list.sort() 

Il est vraiment aussi simple que cela :)

+2

Ne fonctionne pas sur Python 3.6 avec des nombres. Utilisez 'trié (liste)' à la place. – Dmitry

10

Mais comment ces règles de tri spécifique à la langue de la poignée? 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.

41

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

for x in sorted(list): 
    print x 

Ceci retourne une nouvelle version d'une liste triée sans changer la liste originale.

18

La bonne façon de trier des chaînes 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 des contextes ASCII uniquement.

1

On suppose s = "ZWzaAd"

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

print ''.join(sorted(s)) 
4

S'il vous plaît utiliser la fonction tri() dans python3

items = ["love", "like", "play", "cool", "my"] 
sorted(items2) 
Questions connexes