¿Cómo ordenar una lista de cadenas numéricamente?

Sé que esto suena trivial, pero no me di cuenta de que la función sort() de Python era rara. Tengo una lista de “números” que en realidad están en forma de cadena, así que primero los convierto a ints, luego bash una ordenación.

 list1=["1","10","3","22","23","4","2","200"] for item in list1: item=int(item) list1.sort() print list1 

Me da:

 ['1', '10', '2', '200', '22', '23', '3', '4'] 

Lo que quiero es

 ['1','2','3','4','10','22','23','200'] 

He buscado algunos de los algoritmos asociados con la clasificación de conjuntos numéricos, pero los que encontré implican la clasificación de conjuntos alfanuméricos.

Sé que este es probablemente un problema obvio, pero Google y mi libro de texto no ofrecen nada más o menos útil que la función .sort() .

En realidad no has convertido tus cuerdas a ints. O mejor dicho, lo hiciste, pero luego no hiciste nada con los resultados. Lo que quieres es:

 list1 = ["1","10","3","22","23","4","2","200"] list1 = [int(x) for x in list1] list1.sort() 

Sin embargo, Python lo hace aún más fácil para usted: ordenar toma un parámetro con nombre, clave, que es una función que se llama en cada elemento antes de que se compare (pero sin modificar la lista)

 list1 = ["1","10","3","22","23","4","2","200"] # call int(x) on each element before comparing it list1.sort(key=int) 

Podría pasar una función al parámetro key al método .sort . Con esto, el sistema ordenará por clave (x) en lugar de x.

 list1.sort(key=int) 

Por cierto, para convertir la lista a enteros de forma permanente, use la función de map

 list1 = list(map(int, list1)) # you don't need to call list() in Python 2.x 

o lista de comprensión

 list1 = [int(x) for x in list1] 

En caso de que desee utilizar la función sorted() : sorted(list1, key=int)

Devuelve una nueva lista ordenada.

El género de Python no es raro. Es solo que este código:

 for item in list1: item=int(item) 

no está haciendo lo que cree que es – el item no se vuelve a colocar en la lista, simplemente se desecha.

De todos modos, la solución correcta es usar key=int como otros lo han mostrado.

También puedes usar:

 import re def sort_human(l): convert = lambda text: float(text) if text.isdigit() else text alphanum = lambda key: [ convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key) ] l.sort( key=alphanum ) return l
import re def sort_human(l): convert = lambda text: float(text) if text.isdigit() else text alphanum = lambda key: [ convert(c) for c in re.split('([-+]?[0-9]*\.?[0-9]*)', key) ] l.sort( key=alphanum ) return l 

Esto es muy similar para otras cosas que puedes encontrar en Internet, pero también funciona para alfanuméricos como [abc0.1, abc0.2 ..]

La respuesta de Seamus Campbell no funciona en python2.x.
list1 = sorted(list1, key=lambda e: int(e)) usando la función lambda funciona bien.

Intente esto, ordenará la lista en el lugar en orden descendente (en este caso no es necesario especificar una clave):

Proceso

 listB = [24, 13, -15, -36, 8, 22, 48, 25, 46, -9] listC = sorted(listB, reverse=True) # listB remains untouched print listC 

salida:

  [48, 46, 25, 24, 22, 13, 8, -9, -15, -36] 

La solución más reciente es la correcta. Estás leyendo soluciones como una cadena, en cuyo caso el orden es 1, luego 100, luego 104 seguido de 2, luego 21, luego 2001001010, 3 y así sucesivamente.

Tienes que CAST tu entrada como un int en su lugar:

cuerdas ordenadas

stringList = (1, 10, 2, 21, 3)

ints ordenados:

intList = (1, 2, 3, 10, 21)

Para lanzar, solo coloca la stringList dentro de int (blahblah).

Otra vez:

 stringList = (1, 10, 2, 21, 3) newList = int (stringList) print newList => returns (1, 2, 3, 10, 21) 

Ayer natsort el mismo problema y encontré un módulo llamado natsort que soluciona los problemas. Utilizar:

 from natsort import natsorted # Example list of strings a = ['1', '10', '2', '3', '11'] [In] sorted(a) [Out] ['1', '10', '11', '2', '3'] [In] natsorted(a) [Out] ['1', '2', '3', '10', '11'] 

Una forma sencilla de ordenar una lista numérica

  numlists = [5,50,7,51,87,97,53] numlists.sort(reverse=False) print(numlists) 

Si desea utilizar una cadena de números, tome otra lista como se muestra en mi código, funcionará bien.

 list1=["1","10","3","22","23","4","2","200"] k=[] for item in list1: k.append(int(item)) k.sort() print(k) 

Función de clasificación Python3:

 if __name__== '__main__': n = list(input()) print(n) print(sorted(n)) 
 scores = ['91','89','87','86','85'] scores.sort() print (scores) 

Esto me funcionó con la versión 3 de python, aunque no en la versión 2.