2008-08-30 30 views

Respuesta

384

respuesta básica simple:

mylist = ["b", "C", "A"] 
mylist.sort() 

Esto modifica su lista original (es decir, las clases en el lugar). Para obtener una copia ordenada de la lista, sin modificar el original, utilice la función sorted():

for x in sorted(mylist): 
    print x 

Sin embargo, los ejemplos anteriores son un poco ingenua, porque no toman en cuenta la configuración regional, y realizan un caso clasificación sensible. Puede aprovechar el parámetro opcional key para especificar el orden de clasificación personalizado (la alternativa, utilizando cmp, es una solución en desuso, ya que debe evaluarse varias veces; key solo se calcula una vez por elemento).

Por lo tanto, para ordenar de acuerdo a la localización actual, teniendo reglas específicas del idioma en cuenta (cmp_to_key es una función de ayuda de functools):

sorted(mylist, key=cmp_to_key(locale.strcoll)) 

Y, por último, si es necesario, se puede especificar un custom locale para la clasificación:

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'] 

Última nota: se verá ejemplos de clasificación entre mayúsculas y minúsculas que utilizan el método lower() - esas son incorrectos, ya que trabajan sólo para el subconjunto de caracteres ASCII. Esos dos son mal que los datos no-Inglés:

# this is incorrect! 
mylist.sort(key=lambda x: x.lower()) 
# alternative notation, a bit faster, but still wrong 
mylist.sort(key=str.lower) 
+33

'mylist.sort (key = str.lower)' es más rápido. – jfs

+0

Buen punto. Dejaré mi ejemplo actual tal como está, ya que probablemente sea más fácil para un principiante ver lo que está sucediendo, pero lo tendré en cuenta en el futuro. –

+1

Si alguien está curioso, el rendimiento de list.sort() se puede encontrar [aquí] (http://stackoverflow.com/questions/1517347/about-pythons-built-in-sort-method) –

32
list.sort() 

Realmente es así :)

+2

No funciona en Python 3.6 con números. Use 'sorted (list)' en su lugar. – Dmitry

10

Pero, ¿cómo este lenguaje específico mango reglas de clasificación? ¿Tiene en cuenta la configuración regional?

No, list.sort() es una función de clasificación genérica. Si desea ordenar de acuerdo con las reglas de Unicode, tendrá que definir una función de clave de clasificación personalizada. Puede intentar usar el módulo pyuca, pero no sé qué tan completo es.

41

También es de destacar la función sorted():

for x in sorted(list): 
    print x 

Esto devuelve una nueva versión, ordenados en una lista sin cambiar la lista original.

18

La forma correcta de ordenar cadenas es:

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'] 

El ejemplo anterior de mylist.sort(key=lambda x: x.lower()) no tendrán ningún problema para los contextos solamente ASCII.

1

Supongamos s = "ZWzaAd"

Para ordenar por encima de cadena sencilla la solución será inferior a uno.

print ''.join(sorted(s)) 
4

Utilice función sorted() en python3

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