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):
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert 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)
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.
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert 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.
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.
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 :
names =['Jasmine','Alberto','Ross','dig-dog']print("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
locale
et ses méthodes de classement des chaînes pour trier naturellement en fonction des paramètres régionaux actuels.Réponses:
Réponse de base:
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: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
key
pour spécifier un ordre de tri personnalisé (l'alternative, en utilisantcmp
, 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 actuels, en tenant compte des règles spécifiques à la langue (
cmp_to_key
est une fonction d'aide de functools):Et enfin, si vous en avez besoin, vous pouvez spécifier un environnement local personnalisé pour le tri:
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:la source
mylist.sort(key=str.lower)
est plus rapide.[1, 2, 3].sort()
. Lorsquesort()
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'imprimeNone
. Si vous enregistrez votre liste dans une variable, disonsx
appeléex.sort()
, alorsprint(x)
, vous verrez la liste triée.Il convient également de noter la
sorted()
fonction:Cela renvoie une nouvelle version triée d'une liste sans modifier la liste d'origine.
la source
C'est aussi simple que ça :)
la source
La bonne façon de trier les chaînes est:
L'exemple précédent de
mylist.sort(key=lambda x: x.lower())
fonctionnera bien pour les contextes ASCII uniquement.la source
Veuillez utiliser la fonction sorted () en Python3
la source
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.la source
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 :Appelez ensuite avec par exemple:
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.)
la source
Supposer
s = "ZWzaAd"
Pour trier au-dessus de la chaîne, la solution simple sera inférieure à un.
la source
la source
Résultat
la source
C'est simple: https://trinket.io/library/trinkets/5db81676e4
scores = scores.split (',') pour x en triés (scores): print (x)
la source