2011-09-10 18 views
17

voglio ordinare una stringa in un elenco in ordine lessicografico comeOrdina una stringa in ordine lessicografico pitone

str='aAaBbcCdE' 

a

['A','a','a','B','b','C','c','d','E'] 

ma sorted() mi dà questo output:

['A','B','C','E','a','a','b','c','d'] 

Come posso ordinare in modo lessicografico?

+2

Obsoleto e * lento *. –

risposta

23

Non utilizzare le funzioni lambda quando c'è quelli incorporati per il lavoro. Inoltre non usare mai la cmp argomento ordinato perché è sconsigliato:

sorted(s, key=str.lower) 

o

sorted(s, key=str.upper) 

Ma questo non può continuare a 'A' e 'un' in ordine, quindi:

sorted(sorted(s), key=str.upper) 

che sarà e, per la natura di sorted l'operazione sarà molto veloce per liste quasi ordinate (il secondo sorted).

+0

Bella soluzione Grazie mille –

4

cmp era il vecchio modo di fare questo, ormai deprecato, ma per i posteri:

s='aAaBbcCdE' 
sorted(s, lambda x,y: cmp(x.lower(), y.lower()) or cmp(x,y)) 
+0

che non mantiene l'ordine! –

+0

cosa vuoi dire che non è così? '['A', 'a', 'a', 'B', 'b', 'C', 'c', 'd', 'E']' –

+0

sì mi dispiace scusami .. Grazie a lotto .. –

9

si potrebbe usare un 2-tuple per la chiave:

text='aAaBbcCdE' 
sorted(text,key=lambda x:(str.lower(x),x)) 
# ['A', 'a', 'a', 'B', 'b', 'C', 'c', 'd', 'E'] 

Il primo elemento nella tupla, str.lower(x) è la chiave primaria (facendo a venire prima B), mentre x si rompe i legami (facendo A venire prima a).

Problemi correlati