Cómo ordenar una lista de cadenas numéricamente
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.
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 . sort
toma 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])
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
.
Podrías pasar una función al key
parámetro del .sort
mé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 map
funció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]
En caso de que quieras utilizar sorted()
la función:sorted(list1, key=int)
Devuelve una nueva lista ordenada.