¿Cómo ordenar una lista de cadenas?

417

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

skolima
fuente
1
Use localey sus métodos de clasificación de cadenas para ordenar de forma natural de acuerdo con la configuración regional actual.
u0b34a0f6ae

Respuestas:

519

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, ya que no tienen en cuenta la configuración regional y realizan una clasificación sensible a 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 de acuerdo con 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 ordenación sin distinción entre mayúsculas y minúsculas que utilizan el lower()método; estos son incorrectos, porque funcionan solo para el subconjunto de caracteres ASCII. Esos dos están equivocados para cualquier información 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
fuente
37
mylist.sort(key=str.lower)es más rápido.
jfs
1
Buen punto. Dejaré mi ejemplo actual tal cual, ya que probablemente sea más fácil para un principiante ver lo que está sucediendo, pero lo tendré en cuenta en el futuro.
Eli Courtwright
1
Si alguien tiene curiosidad, el rendimiento de list.sort () se puede encontrar aquí
Hari Ganesan
1
@BornToCode: 1- Lo sé . Mire la revisión (2008) a la que responde mi comentario (mi comentario es sobre el uso innecesario de lambda). 2- ordenar caracteres no ASCII es un gran tema separado. PyICU podría usarse en lugar de la solución basada en la configuración regional.
jfs
1
@Dmitry Esto se debe a que está imprimiendo el valor de retorno de la función de clasificación invocada [1, 2, 3].sort(). A medida que sort()ordena la lista en su lugar (es decir, cambia la lista directamente), no devuelve la lista ordenada y, en realidad, no devuelve nada, por lo que se imprime la declaración de impresión None. Si guardó su lista en una variable, digamos x, llamada x.sort(), print(x)verá la lista ordenada.
bjg222
56

También vale la pena señalar la sorted()función:

for x in sorted(list):
    print x

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

Greg Hewgill
fuente
36
list.sort()

Es realmente así de simple :)

rix0rrr
fuente
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())funcionará bien para contextos solo ASCII.

Schmichael
fuente
13

Utilice la función sorted () en Python3

items = ["love", "like", "play", "cool", "my"]
sorted(items2)
Mahmud Ahsan
fuente
10

Pero, ¿cómo maneja esto las reglas de clasificación específicas del idioma? ¿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, deberá definir una función de clave de clasificación personalizada. Puedes intentar usar el módulo pyuca , pero no sé qué tan completo está.

John Millikin
fuente
1

Antigua pregunta, pero si desea realizar una ordenación local sin configuración locale.LC_ALL , puede hacerlo utilizando la biblioteca PyICU como sugiere esta respuesta :

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)

Luego llame con, por ejemplo:

new_list = sorted_strings(list_of_strings, "de_DE.utf8")

Esto funcionó para mí sin instalar ninguna configuración regional o cambiar otras configuraciones del sistema.

(Esto ya se sugirió en un comentario anterior , pero quería darle más importancia, porque al principio lo extrañé).

vlz
fuente
0

Suponer s = "ZWzaAd"

Para ordenar la cadena anterior, la solución simple estará debajo de una.

print ''.join(sorted(s))
Jon
fuente
esa no es una lista de cadenas que está ordenando aquí
mnl
0

O tal vez:

names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
Dragos Alexe
fuente
0
l =['abc' , 'cd' , 'xy' , 'ba' , 'dc']
l.sort()
print(l1)

Resultado

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

asing177
fuente
0

Es simple: 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'

puntuaciones = puntuaciones.split (',') para x en ordenado (puntuaciones): imprimir (x)

Hedayatullah Sarwary
fuente