Ordenar una lista de números separados por puntos, como versiones de software

Tengo una lista que contiene cadenas de versión, como cosas:

versions_list = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"] 

Me gustaría ordenarlo, por lo que el resultado sería algo como esto:

 versions_list = ["1.0.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"] 

El orden de precedencia para los dígitos debe ser obviamente de izquierda a derecha, y debe ser descendente. Entonces 1.2.3 viene antes que 2.2.3 y 2.2.2 viene antes que 2.2.3 .

¿Cómo hago esto en Python?

Divide cada cadena de versión para compararla como una lista de enteros:

 versions_list.sort(key=lambda s: map(int, s.split('.'))) 

Da, para tu lista:

 ['1.0.0', '1.0.2', '1.0.12', '1.1.2', '1.3.3'] 

En Python3, el map ya no devuelve una list , por lo que necesitamos envolverla en una llamada de list .

 versions_list.sort(key=lambda s: list(map(int, s.split('.')))) 

La alternativa al mapa aquí es una lista de comprensión . Ver esta publicación para más información en la lista de comprensiones.

 versions_list.sort(key=lambda s: [int(u) for u in s.split('.')]) 

También puede usar el módulo distutils.version de la biblioteca estándar:

 from distutils.version import StrictVersion versions = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"] versions.sort(key=StrictVersion) 

Te dio:

 ['1.0.0', '1.0.2', '1.0.12', '1.1.2', '1.3.3'] 

También puede manejar versiones con tags de prelanzamiento, por ejemplo:

 versions = ["1.1", "1.1b1", "1.1a1"] versions.sort(key=StrictVersion) 

Te dio:

 ["1.1a1", "1.1b1", "1.1"] 

Documentación: https://github.com/python/cpython/blob/3.2/Lib/distutils/version.py#L101

natsort propone “clasificación natural”; que funciona muy intuitivamente (en Python 3)

 from natsort import natsorted versions = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"] natsorted(versions) 

da

 ['1.0.0', '1.0.2', '1.0.12', '1.1.2', '1.3.3'] 

pero funciona también en nombres completos de paquetes con número de versión:

 versions = ['version-1.9', 'version-2.0', 'version-1.11', 'version-1.10'] natsorted(versions) 

da

 ['version-1.9', 'version-1.10', 'version-1.11', 'version-2.0'] 

También resolví esta pregunta usando Python, aunque mi versión hace algunas cosas adicionales, aquí está mi código:

 def answer(l): list1 = [] # this is the list for the nested strings for x in l: list1.append(x.split(".")) list2 = [] # this is the same list as list one except everything is an integer in order for proper sorting for y in list1: y = map(int, y) list2.append(y) list3 = sorted(list2) #this is the sorted list of of list 2 FinalList = [] # this is the list that converts everything back to the way it was for a in list3: a = '.'.join(str(z) for z in a) FinalList.append(a) return FinalList 

Para las versiones existen tres cosas; Mayor, Menor, y la revisión. Lo que esto hace es que lo organiza de modo que '1' aparezca antes de '1.0' que antes de '1.0.0' . Además, otra ventaja es que no es necesario importar bibliotecas en caso de que no las tenga, y funciona con versiones antiguas de Python, esta fue diseñada específicamente para la versión 2.7.6. De todos modos, aquí hay algunos ejemplos:

 Inputs: (string list) l = ["1.1.2", "1.0", "1.3.3", "1.0.12", "1.0.2"] Output: (string list) ["1.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"] Inputs: (string list) l = ["1.11", "2.0.0", "1.2", "2", "0.1", "1.2.1", "1.1.1", "2.0"] Output: (string list) ["0.1", "1.1.1", "1.2", "1.2.1", "1.11", "2", "2.0", "2.0.0"] 

Si tiene alguna pregunta, solo comente la respuesta!