Risposte:
Risposta di base:
mylist = ["b", "C", "A"]
mylist.sort()
Questo modifica il tuo elenco originale (cioè ordina sul posto). Per ottenere una copia ordinata dell'elenco, senza modificare l'originale, utilizzare la sorted()
funzione:
for x in sorted(mylist):
print x
Tuttavia, gli esempi sopra riportati sono un po 'ingenui, poiché non tengono conto delle impostazioni locali ed eseguono un ordinamento sensibile al maiuscolo / minuscolo. È possibile sfruttare il parametro facoltativo key
per specificare l'ordinamento personalizzato (l'alternativa, utilizzando cmp
, è una soluzione obsoleta, poiché deve essere valutata più volte - key
viene calcolata una sola volta per elemento).
Quindi, per ordinare in base alle cmp_to_key
impostazioni internazionali correnti, tenendo conto delle regole specifiche della lingua ( è una funzione di supporto da functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
Infine, se necessario, è possibile specificare un'impostazione internazionale personalizzata per l'ordinamento:
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']
Ultima nota: vedrai esempi di ordinamento senza distinzione tra maiuscole e minuscole che utilizzano il lower()
metodo: quelli non sono corretti, perché funzionano solo per il sottoinsieme di caratteri ASCII. Quei due sono errati per qualsiasi dato non inglese:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
mylist.sort(key=str.lower)
è più veloce.
[1, 2, 3].sort()
. Man mano che sort()
ordina l'elenco sul posto (cioè cambia direttamente l'elenco), non restituisce l'elenco ordinato e in realtà non restituisce nulla, quindi viene stampata la dichiarazione di stampa None
. Se hai salvato il tuo elenco in una variabile, ad esempio x
, chiamato x.sort()
, quindi print(x)
, vedresti l'elenco ordinato.
Vale anche la pena notare la sorted()
funzione:
for x in sorted(list):
print x
Ciò restituisce una nuova versione ordinata di un elenco senza modificare l'elenco originale.
Il modo corretto di ordinare le stringhe è:
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'esempio precedente mylist.sort(key=lambda x: x.lower())
funzionerà bene per contesti solo ASCII.
Utilizzare la funzione sort () in Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Ma come gestisce le regole di ordinamento specifiche della lingua? Tiene conto delle impostazioni locali?
No, list.sort()
è una funzione di ordinamento generica. Se si desidera ordinare in base alle regole Unicode, è necessario definire una funzione chiave di ordinamento personalizzata. Puoi provare a usare il modulo pyuca , ma non so quanto sia completo.
Vecchia domanda, ma se si desidera eseguire un ordinamento in base alle impostazioni locali senza impostazione, locale.LC_ALL
è possibile farlo utilizzando la libreria PyICU come suggerito da questa risposta :
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)
Quindi chiama con es:
new_list = sorted_strings(list_of_strings, "de_DE.utf8")
Questo ha funzionato per me senza installare alcuna locale o modificare altre impostazioni di sistema.
(Questo è già stato suggerito in un commento sopra , ma volevo dargli maggiore risalto, perché all'inizio mi mancava da solo.)
O forse:
names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
È semplice: 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'
score = score.split (',') per x in ordinato (punteggi): stampa (x)
locale
ed è i metodi di fascicolazione delle stringhe per ordinare in modo naturale in base alle impostazioni internazionali correnti.