Come ordinare un elenco di stringhe?
Domanda
Qual è il modo migliore per creare un elenco ordinato alfabeticamente in Python?
Soluzione
Risposta di base:
mylist = ["b", "C", "A"]
mylist.sort()
Questo modifica il tuo elenco originale (ad es.ordina sul posto).Per ottenere una copia ordinata dell'elenco, senza modificare l'originale, utilizzare il file sorted()
funzione:
for x in sorted(mylist):
print x
Tuttavia, gli esempi precedenti sono un po' ingenui, poiché non tengono conto della localizzazione ed eseguono un ordinamento con distinzione tra maiuscole e minuscole.Puoi sfruttare il parametro opzionale key
per specificare un ordinamento personalizzato (l'alternativa, utilizzando cmp
, è una soluzione deprecata, poiché deve essere valutata più volte - key
viene calcolato solo una volta per elemento).
Pertanto, per ordinare in base alle impostazioni locali correnti, tenendo conto delle regole specifiche della lingua (cmp_to_key
è una funzione di supporto di functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
E infine, se necessario, puoi specificare a 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:vedrai esempi di ordinamento senza distinzione tra maiuscole e minuscole che utilizzano l'estensione lower()
metodo - quelli 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)
Altri suggerimenti
Vale anche la pena notare il sorted()
funzione:
for x in sorted(list):
print x
Ciò restituisce una nuova versione ordinata di un elenco senza modificare l'elenco originale.
list.sort()
E 'davvero così semplice :)
Il modo corretto per 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 di mylist.sort(key=lambda x: x.lower())
funzionerà bene per contesti solo ASCII.
Ma come vengono gestite le regole di ordinamento specifiche della lingua?Tiene conto della localizzazione?
NO, list.sort()
è una funzione di ordinamento generica.Se desideri ordinare secondo le regole Unicode, dovrai definire una funzione chiave di ordinamento personalizzata.Puoi provare a utilizzare il file pyuca module, ma non so quanto sia completo.
Si prega di utilizzare la funzione sorted() in Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Supponiamo s = "ZWzaAd"
Per ordinare la stringa sopra, la soluzione semplice sarà sotto uno.
print ''.join(sorted(s))
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()))