对点分隔的数字列表进行sorting,如软件版本

我有一个包含版本string的列表,例如:

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

我想sorting它,结果会是这样的:

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

数字的优先顺序显然应该是从左到右,应该是递减的。 所以1.2.3之前2.2.32.2.3之前都是2.2.3之前。

我如何在Python中做到这一点?

拆分每个版本string以将其作为整数列表进行比较:

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

给出,为您的名单:

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

在Python3中map不再返回一个list ,所以我们需要把它包装在一个list调用中 。

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

这里映射的替代scheme是列表理解 。 有关列表parsing,请参阅此文章 。

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

你也可以使用标准库的distutils.version模块:

 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) 

给你:

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

它也可以处理带有预发布标签的版本,例如:

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

给你:

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

文档: https : //github.com/python/cpython/blob/3.2/Lib/distutils/version.py#L101

natsort提出“自然sorting”; 这非常直观地工作(在Python 3中)

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

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

但是对于包含完整软件包名称的版本号也是如此:

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

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

我也使用Python解决了这个问题,虽然我的版本做了一些额外的事情,这里是我的代码:

 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 

对于版本,有三件事情。 主修,小调和修改。 它所做的就是将它组织起来,以使得'1'会在'1.0.0'之前出现。 此外,另外还有一个优点是,不需要导入任何没有库的库,它可以和老版本的Python一起工作,这个版本专门用于2.7.6版本。 无论如何,这里有几个例子:

 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"] 

如果您有任何问题,只需评论答案!