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

5 minutos de lectura

¿Como ordenar una lista de cadenas numericamente
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.

  • 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 pensar list 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


¿Como ordenar una lista de cadenas numericamente
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)

  • cuando pruebo key=int en 2.7 obtengo Ninguno

    – KI4JGT

    28 de enero de 2013 a las 5:48

  • Esto funciona si el elemento de la lista se almacena como “entero”, ¿cómo se manejará en caso de valores flotantes? Por ejemplo, lista1 = [1, 1.10, 1.11, 1.1, 1.2]

    – satisfecha

    19 de mayo de 2016 a las 9:01


  • @KI4JGT el método de clasificación modifica la lista y devuelve Ninguno. Entonces, en lugar de list1 = list1.sort(key=int)usa solo list1.sort(key=int) y list1 ya estará ordenado.

    – Josías Yoder

    20 de junio de 2018 a las 16:41

  • @KI4JGT .sort() es un operador en el lugar, devuelve Ninguno, ordena la lista, es posible que desee usar sorted()

    – sherpya

    14/11/2018 a las 15:31

1646753770 342 ¿Como ordenar una lista de cadenas numericamente
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.

  • Trabajó para mí en versiones ['1.1.9', '1.1.10')] ordenar donde int() no lo hizo. Impresionante y elegante! ¡Gracias!

    – Drey

    21 oct 2021 a las 14:01


1646753771 734 ¿Como ordenar una lista de cadenas numericamente
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]

1646753772 372 ¿Como ordenar una lista de cadenas numericamente
siam

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

Devuelve una nueva lista ordenada.

1646753773 141 ¿Como ordenar una lista de cadenas numericamente
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, ...].

  • Probablemente debería devolver una nueva lista o modificar la lista, no ambas cosas. El código anterior modifica la lista y luego la devuelve. Utilizar sorted() para hacer una nueva lista en su lugar.

    – Víctor Nordam Suadicani

    17 de noviembre de 2020 a las 19:15

1646753774 77 ¿Como ordenar una lista de cadenas numericamente
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.

  • Probablemente debería devolver una nueva lista o modificar la lista, no ambas cosas. El código anterior modifica la lista y luego la devuelve. Utilizar sorted() para hacer una nueva lista en su lugar.

    – Víctor Nordam Suadicani

    17 de noviembre de 2020 a las 19:15

¿Como ordenar una lista de cadenas numericamente
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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad