¿Cómo ordenar una lista de cadenas?

Resuelto skolima asked hace 16 años • 11 respuestas

¿Cuál es la mejor manera de crear una lista ordenada alfabéticamente en Python?

skolima avatar Aug 31 '08 00:08 skolima
Aceptado

Respuesta básica:

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

Esto modifica su lista original (es decir, ordena en el lugar). Para obtener una copia ordenada de la lista, sin cambiar el original, use la sorted()función:

for x in sorted(mylist):
    print x

Sin embargo, los ejemplos anteriores son un poco ingenuos, porque no tienen en cuenta la configuración regional y realizan una clasificación que distingue entre mayúsculas y minúsculas. Puede aprovechar el parámetro opcional keypara especificar un orden de clasificación personalizado (la alternativa, usar cmp, es una solución obsoleta, ya que debe evaluarse varias veces; keysolo se calcula una vez por elemento).

Entonces, para ordenar según la configuración regional actual, teniendo en cuenta las reglas específicas del idioma ( cmp_to_keyes una función auxiliar de functools):

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

Y finalmente, si lo necesita, puede especificar una configuración regional personalizada para ordenar:

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: verá ejemplos de clasificación que no distingue entre mayúsculas y minúsculas que utilizan el lower()método; son incorrectos porque solo funcionan para el subconjunto de caracteres ASCII. Esos dos son incorrectos para cualquier dato que no esté en 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)
Eli Courtwright avatar Aug 30 '2008 17:08 Eli Courtwright

También cabe destacar la sorted()función:

for x in sorted(list):
    print x

Esto devuelve una versión nueva y ordenada de una lista sin cambiar la lista original.

Greg Hewgill avatar Aug 30 '2008 22:08 Greg Hewgill