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):
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert 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)
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.
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert 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.
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á.
Antigua pregunta, pero si desea realizar una ordenación local sin configuraciónlocale.LC_ALL , puede hacerlo utilizando la biblioteca PyICU como sugiere esta respuesta :
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()))
locale
y sus métodos de clasificación de cadenas para ordenar de forma natural de acuerdo con la configuración regional actual.Respuestas:
Respuesta básica:
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: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
key
para especificar un orden de clasificación personalizado (la alternativa, usarcmp
, es una solución obsoleta, ya que debe evaluarse varias veces,key
solo 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_key
es una función auxiliar de functools):Y finalmente, si lo necesita, puede especificar una configuración regional personalizada para ordenar:
Ú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:fuente
mylist.sort(key=str.lower)
es más rápido.[1, 2, 3].sort()
. A medida quesort()
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ónNone
. Si guardó su lista en una variable, digamosx
, llamadax.sort()
,print(x)
verá la lista ordenada.También vale la pena señalar la
sorted()
función:Esto devuelve una nueva versión ordenada de una lista sin cambiar la lista original.
fuente
Es realmente así de simple :)
fuente
La forma correcta de ordenar cadenas es:
El ejemplo anterior de
mylist.sort(key=lambda x: x.lower())
funcionará bien para contextos solo ASCII.fuente
Utilice la función sorted () en Python3
fuente
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á.fuente
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 :Luego llame con, por ejemplo:
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ñé).
fuente
Suponer
s = "ZWzaAd"
Para ordenar la cadena anterior, la solución simple estará debajo de una.
fuente
fuente
Resultado
fuente
Es simple: https://trinket.io/library/trinkets/5db81676e4
puntuaciones = puntuaciones.split (',') para x en ordenado (puntuaciones): imprimir (x)
fuente