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, por lo que primero los convierto en ints, 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 ordenación de conjuntos numéricos, pero los que encontré implican la ordenación de conjuntos alfanuméricos.
Sé que esto probablemente no sea un problema obvio, pero Google y mi libro de texto no ofrecen nada más o menos útil que la .sort()
función.
list1
. ¿Qué te hizo pensar quelist
se estaba actualizando?sorted(mylist)
Respuestas:
En realidad no has convertido tus cadenas en ints. O más bien, lo hiciste, pero luego no hiciste nada con los resultados. Lo que quieres es:
Si por alguna razón necesita mantener cadenas en lugar de entradas (generalmente es una mala idea, pero tal vez necesite preservar los ceros iniciales o algo así), puede usar una función de tecla .
sort
toma un parámetro con nombrekey
, 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:fuente
list1 = list1.sort(key=int)
usar justlist1.sort(key=int)
y list1 ya estará ordenado.Se podía pasar una función a la
key
parámetro para el.sort
método . Con esto, el sistema ordenará por clave (x) en lugar de x.Por cierto, para convertir la lista a enteros de forma permanente, use la
map
funcióno lista de comprensión
fuente
En caso de que quiera usar la
sorted()
función:sorted(list1, key=int)
Devuelve una nueva lista ordenada.
fuente
El tipo de Python no es raro. Es solo que este código:
no está haciendo lo que crees que es,
item
no se reemplaza de nuevo en la lista, simplemente se descarta.De todos modos, la solución correcta es usar
key=int
como otros te han mostrado.fuente
También puedes usar:
Esto es muy similar a otras cosas que puedes encontrar en Internet, pero también funciona para alfanuméricos como
[abc0.1, abc0.2, ...]
.fuente
La respuesta de Seamus Campbell no funciona en python2.x.
list1 = sorted(list1, key=lambda e: int(e))
El uso de lalambda
función funciona bien.fuente
Ayer abordé el mismo problema y encontré un módulo llamado [natsort] [1], que resuelve su problema. Utilizar:
También funciona para diccionarios como un equivalente de
sorted
. [1]: https://pypi.org/project/natsort/fuente
Pruebe esto, ordenará la lista en el lugar en orden descendente (no es necesario especificar una clave en este caso):
Proceso
salida:
fuente
La solución más reciente es la correcta. Está 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 CASTAR tu entrada como int en su lugar:
cuerdas clasificadas:
stringList = (1, 10, 2, 21, 3)
entradas ordenadas:
intList = (1, 2, 3, 10, 21)
Para lanzar, simplemente coloque la cadenaLista dentro de int (blahblah).
De nuevo:
fuente
Si desea usar cadenas de números, tome otra lista como se muestra en mi código, funcionará bien.
fuente
Manera simple de ordenar una lista numérica
fuente
El verdadero problema es que ese tipo clasifica las cosas de forma alfanumérica. Entonces, si tiene una lista ['1', '2', '10', '19'] y ejecuta sort obtendrá ['1', '10'. '19', '2']. es decir, 10 viene antes que 2 porque mira el primer personaje y ordena a partir de eso. Parece que la mayoría de los métodos en Python devuelven las cosas en ese orden. Por ejemplo, si tiene un directorio llamado abc con los archivos etiquetados como 1.jpg, 2.jpg, etc., diga hasta 15.jpg y haga file_list = os.listdir (abc), la file_list no está ordenada como esperaba, sino más bien como file_list = ['1.jpg', '11 .jpg '---' 15.jpg ',' 2.jpg]. Si el orden en que se procesan los archivos es importante (presumiblemente por eso los nombró numéricamente), el orden no es lo que cree que será. Puede evitar esto utilizando el relleno "ceros". Por ejemplo, si tiene una lista alist = ['01', '03', '05', '10', '02', '04', '06] y ejecuta sort en ella, obtiene el orden que deseaba. alist = ['01', '02', etc.] porque el primer carácter es 0 que viene antes que 1. La cantidad de ceros que necesita está determinada por el valor más grande en la lista. Por ejemplo, si el más grande es entre 100 y 1000 necesita rellenar dígitos individuales como 001, 002 --- 010,011--100, 101 etc.
fuente
Esto funcionó para mí usando Python versión 3, aunque no lo hizo en la versión 2.
fuente