Come ordinare un elenco di stringhe?


417

Qual è il modo migliore per creare un elenco in ordine alfabetico in Python?


1
Utilizzare localeed è i metodi di fascicolazione delle stringhe per ordinare in modo naturale in base alle impostazioni internazionali correnti.
u0b34a0f6ae,

Risposte:


519

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 keyper specificare l'ordinamento personalizzato (l'alternativa, utilizzando cmp, è una soluzione obsoleta, poiché deve essere valutata più volte - keyviene calcolata una sola volta per elemento).

Quindi, per ordinare in base alle cmp_to_keyimpostazioni 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)

37
mylist.sort(key=str.lower)è più veloce.
jfs,

1
Buon punto. Lascerò il mio esempio attuale così com'è, poiché probabilmente è più facile per un principiante vedere cosa sta succedendo, ma lo terrò a mente in futuro.
Eli Courtwright,

1
Se qualcuno è curioso, le prestazioni di list.sort () possono essere trovate qui
Hari Ganesan

1
@BornToCode: 1- Lo so . Guarda la revisione (2008) a cui risponde il mio commento (il mio commento riguarda l'uso non necessario di lambda). 2- l'ordinamento di caratteri non ASCII è un argomento separato. PyICU potrebbe essere utilizzato al posto della soluzione basata su locale.
jfs,

1
@Dmitry Questo perché si sta stampando il valore di ritorno della funzione di ordinamento richiamata [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.
bjg222,

56

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.



18

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.


13

Utilizzare la funzione sort () in Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)

10

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.


1

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.)


0

supporre s = "ZWzaAd"

Per ordinare sopra la stringa la soluzione semplice sarà sotto una.

print ''.join(sorted(s))

non è un elenco di stringhe che stai ordinando qui
mnl

0

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()))

0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Risultato

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


0

È 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)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.