2011-09-10 111 views
17

quiero ordenar una cadena a una lista en orden lexicográfico comoOrdenar una cadena en Python orden lexicográfico

str='aAaBbcCdE' 

a

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

pero sorted() me da este resultado:

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

¿Cómo puedo ordenar lexicográficamente?

+2

Obsoleto y * lento *. –

Respuesta

23

No utilice las funciones lambda cuando hay otras incorporadas para el trabajo. Además, nunca utilice el argumento cmp de ordenada porque está obsoleto:

sorted(s, key=str.lower) 

o

sorted(s, key=str.upper) 

Pero eso no puede mantener el 'A' y 'a' con el fin, por lo que:

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

que lo hará y, por la naturaleza de sorted, la operación será muy rápida para las listas casi ordenadas (la segunda sorted).

+0

Buena solución Muchas gracias –

4

cmp fue la vieja manera de hacer esto, ahora en desuso, pero para la posteridad:

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

que no mantiene el orden! –

+0

¿qué quieres decir con que no? '['A', 'a', 'a', 'B', 'b', 'C', 'c', 'd', 'E']' –

+0

Sí, lo lamento, lo siento mal .. Gracias a lote ... –

9

Se puede usar un 2-tupla de la clave:

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

El primer elemento de la tupla, str.lower(x) es la clave principal (haciendo a vienen antes B), mientras que x sí rompe lazos (haciendo A ven antes del a).

Cuestiones relacionadas