对点分隔的数字列表进行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.3
和2.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"]
如果您有任何问题,只需评论答案!