Qual è il modo migliore per creare una lista ordinata alfabeticamente in Python?
Risposta di base:
mylist = ["b", "C", "A"]
mylist.sort()
Questo modifica la tua lista originale (cioè ordina in-place). Per ottenere una copia ordinata della lista, senza modificare l'originale, usa la funzione sorted()
:
for x in sorted(mylist):
print x
Tuttavia, gli esempi di cui sopra sono un po' ingenui, perché non tengono conto del locale, ed eseguono un ordinamento sensibile alle maiuscole. Puoi sfruttare il parametro opzionale key
per specificare un ordine di ordinamento personalizzato (l'alternativa, usando cmp
, è una soluzione deprecata, poiché deve essere valutata più volte - key
è calcolata solo una volta per elemento).
Quindi, per ordinare secondo il locale corrente, tenendo conto delle regole specifiche della lingua (cmp_to_key
è una funzione di aiuto di functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
E infine, se hai bisogno, puoi specificare un locale personalizzato 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: vedrete esempi di ordinamento insensibile alle maiuscole e alle minuscole che usano il metodo lower()
- questi non sono corretti, perché funzionano solo per il sottoinsieme di caratteri ASCII. Questi due sono sbagliati 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)
Ma come gestisce le regole di ordinamento specifiche della lingua? Tiene conto del locale?
No, list.sort()
è una funzione di ordinamento generica. Se vuoi ordinare secondo le regole Unicode, dovrai definire una funzione di ordinamento personalizzata. Puoi provare ad usare il modulo pyuca, ma non so quanto sia completo.