Cómo ordenar una lista de cadenas numéricamente

Resuelto Brian asked hace 14 años • 16 respuestas

Sé que esto suena trivial, pero no me di cuenta de que la sort()función de Python era extraña. Tengo una lista de "números" que en realidad están en forma de cadena, así que primero los convierto a enteros y luego intento ordenarlos.

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

Quiero

['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é involucraban la clasificación de conjuntos alfanuméricos.

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

Brian avatar Aug 07 '10 00:08 Brian
Aceptado

En realidad, no has convertido tus cadenas a enteros. 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()

Si por alguna razón necesita mantener cadenas en lugar de enteros (generalmente es una mala idea, pero tal vez necesite conservar los ceros a la izquierda o algo así), puede usar una función clave . sorttoma un parámetro con nombre key, que es una función que se llama en cada elemento antes de compararlo. Los valores de retorno de la función clave se comparan en lugar de comparar los elementos de la lista directamente:

list1 = ["1","10","3","22","23","4","2","200"]
# call int(x) on each element before comparing it
list1.sort(key=int)
# or if you want to do it all in the same line
list1 = sorted([int(x) for x in list1]) 
Seamus Campbell avatar Aug 06 '2010 17:08 Seamus Campbell

Abordé el mismo problema ayer y encontré un módulo llamado natsort , que resuelve tu problema. Usar:

from natsort import natsorted # pip install natsort

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

# Your array may contain strings
[In]  natsorted(['string11', 'string3', 'string1', 'string10', 'string100'])
[Out] ['string1', 'string3', 'string10', 'string11', 'string100']

También funciona para diccionarios como equivalente de sorted.

lrsp avatar May 23 '2018 18:05 lrsp

Podrías pasar una función al keyparámetro del .sortmétodo . Con esto, el sistema ordenará por clave (x) en lugar de x.

list1.sort(key=int)

Por cierto, para convertir la lista a números enteros de forma permanente, use la mapfunción

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

o comprensión de listas

list1 = [int(x) for x in list1]
kennytm avatar Aug 06 '2010 17:08 kennytm

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

Devuelve una nueva lista ordenada.

syam avatar Dec 28 '2012 18:12 syam