Comment trier une liste de chaînes?

417

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

skolima
la source
1
Utilisez localeet ses méthodes de classement des chaînes pour trier naturellement en fonction des paramètres régionaux actuels.
u0b34a0f6ae

Réponses:

519

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 changer l'original, utilisez la sorted()fonction:

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 profiter du paramètre facultatif keypour spécifier un ordre de tri personnalisé (l'alternative, en utilisant cmp, est une solution obsolète, car elle doit être évaluée plusieurs fois - keyn'est calculée qu'une seule fois par élément).

Donc, pour trier selon les paramètres régionaux actuels, en tenant compte des règles spécifiques à la langue ( cmp_to_keyest 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 non sensible à la casse qui utilisent la lower()méthode - 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 anglaises:

# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Eli Courtwright
la source
37
mylist.sort(key=str.lower)est plus rapide.
jfs
1
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 à l'avenir.
Eli Courtwright
1
Si quelqu'un est curieux, la performance de list.sort () peut être trouvée ici
Hari Ganesan
1
@BornToCode: 1- Je sais . Regardez la révision (2008) à laquelle mon commentaire répond (mon commentaire concerne l'utilisation inutile de lambda). 2- Le tri des caractères non ASCII est un grand sujet distinct. PyICU pourrait être utilisé à la place de la solution locale.
jfs
1
@Dmitry En effet, vous imprimez la valeur de retour de la fonction de tri appelée [1, 2, 3].sort(). Lorsque sort()la liste est triée (c'est-à-dire qu'elle modifie directement la liste), elle ne renvoie pas la liste triée et ne renvoie en fait rien, de sorte que votre instruction d'impression s'imprime None. Si vous enregistrez votre liste dans une variable, disons xappelée x.sort(), alors print(x), vous verrez la liste triée.
bjg222
56

Il convient également de noter la sorted()fonction:

for x in sorted(list):
    print x

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

Greg Hewgill
la source
36
list.sort()

C'est aussi simple que ça :)

rix0rrr
la source
18

La bonne façon de trier les 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 les contextes ASCII uniquement.

schmichael
la source
13

Veuillez utiliser la fonction sorted () en Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Mahmud Ahsan
la source
10

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

Non, list.sort()c'est une fonction de tri générique. Si vous souhaitez 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 à quel point il est complet.

John Millikin
la source
1

Ancienne question, mais si vous souhaitez effectuer un tri sans paramètre en fonction des paramètres régionaux, locale.LC_ALL vous pouvez le faire en utilisant la bibliothèque PyICU comme suggéré par cette réponse :

import icu # PyICU

def sorted_strings(strings, locale=None):
    if locale is None:
       return sorted(strings)
    collator = icu.Collator.createInstance(icu.Locale(locale))
    return sorted(strings, key=collator.getSortKey)

Appelez ensuite avec par exemple:

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

Cela a fonctionné pour moi sans installer de paramètres régionaux ni modifier d'autres paramètres système.

(Cela a déjà été suggéré dans un commentaire ci - dessus , mais je voulais lui donner plus d'importance, car je l'ai manqué moi-même au début.)

vlz
la source
0

Supposer s = "ZWzaAd"

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

print ''.join(sorted(s))
JON
la source
ce n'est pas une liste de chaînes que vous
triez
0

Ou peut-être:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Dragos Alexe
la source
0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Résultat

['abc', 'ba', 'cd', 'dc', 'xy']

asing177
la source
0

C'est simple: https://trinket.io/library/trinkets/5db81676e4

scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'

scores = scores.split (',') pour x en triés (scores): print (x)

Hedayatullah Sarwary
la source