sintaxis - version actual de python
Ordenar una lista de nĂºmeros separados por puntos, como las versiones de software (4)
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 su 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 debemos envolverlo en una list
llamadas .
versions_list.sort(key=lambda s: list(map(int, s.split(''.''))))
La alternativa para mapear aquí es una lista de comprensión . Consulte esta publicación para obtener más información sobre la lista de comprensiones.
versions_list.sort(key=lambda s: [int(u) for u in s.split(''.'')])
Tengo una lista que contiene cadenas de versiones, 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 debería ser, obviamente, de izquierda a derecha, y debería ser descendente. Entonces 1.2.3
viene antes de 2.2.3
y 2.2.2
viene antes de 2.2.3
.
¿Cómo hago esto en Python?
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 etiquetas 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
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 hace esto es que lo organiza de modo que ''1''
vendrá antes de ''1.0''
que vendrá antes de ''1.0.0''
. Además, otra ventaja, no es necesario importar ninguna biblioteca en el caso de que no la tenga, y funciona con las versiones anteriores de Python, esta fue específicamente diseñada 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 tienes alguna pregunta, ¡solo comenta la respuesta!
natsort propone "clasificación natural"; que funciona de manera muy intuitiva (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 igual en los nombres completos de los paquetes con el 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'']