
Brian
Sé que esto suena trivial, pero no me di cuenta de que el sort()
La 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 en 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']
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 todos los que encontré implican la clasificación de conjuntos alfanuméricos.
Sé que esto es probablemente un problema obvio, pero Google y mi libro de texto no ofrecen nada más o menos útil que el .sort()
función.

seamus campbell
En realidad, no ha convertido sus 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 una mala idea, pero tal vez necesite conservar los ceros iniciales o algo así), puede usar un llave función. 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)

lrsp
Me acerqué al mismo problema ayer y encontré un módulo llamado natsort, que resuelve tu problema. Utilizar:
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 un equivalente de sorted
.

kennytm
Podrías pasar una función al key
parámetro a los .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, utilice los map
función
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]

siam
En caso de que quieras usar sorted()
función: sorted(list1, key=int)
Devuelve una nueva lista ordenada.

Julian
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
Esto es muy similar a otras cosas que puedes encontrar en Internet, pero también funciona para alfanuméricos como [abc0.1, abc0.2, ...]
.

daniel rosaman
El tipo de Python no es extraño. Es solo que este código:
for item in list1:
item=int(item)
no está haciendo lo que crees que es – 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 te han mostrado.

marx lobo
seamus campbellLa respuesta de no funciona en python2.x.
list1 = sorted(list1, key=lambda e: int(e))
utilizando lambda
la función funciona bien.
Tenga en cuenta que su bucle for no hace lo que sospecho que cree que hace.
– desinst
6 de agosto de 2010 a las 17:21
En ningún momento actualizaste
list1
. que te hizo pensarlist
se estaba actualizando?– S. Lott
6 de agosto de 2010 a las 17:23
El problema similar surge cuando list1 = [‘1’, ‘1.10’, ‘1.11’, ‘1.1’, ‘1.2’] se proporciona como entrada. En lugar de obtener la salida como [‘1’, ‘1.1’, ‘1.2’, ‘1.10’, ‘1.11’]Estoy obteniendo [‘1’, ‘1.1’, ‘1.10’, ‘1.11’, ‘1.2’]
– satisfecha
20 de mayo de 2016 a las 3:46
en python 3 es posible que desee utilizar
sorted(mylist)
– Akin Hwan
23 de diciembre de 2018 a las 15:02