对以点分隔的数字列表进行排序,例如软件版本
- 2025-02-21 08:47:00
- admin 原创
- 30
问题描述:
我有一个包含版本字符串的列表,例如:
versions_list = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]
我想对其进行排序,因此结果将是这样的:
versions_list = ["1.0.0", "1.0.2", "1.0.12", "1.1.2", "1.3.3"]
数字的优先顺序显然应该是从左到右,并且应该是降序的。所以1.2.3
comes before2.2.3
和2.2.2
comes before 2.2.3
。
我如何用 Python 来实现这一点?
解决方案 1:
Python 3.10+
Stdlib distutils 已被弃用,并在 Python 3.12 中被完全删除(ref)。请参阅Tobias Leupold 的回答,了解当前 Python 版本中的最佳方法。
Python < 3.10
您还可以使用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
解决方案 2:
拆分每个版本字符串并将其作为整数列表进行比较:
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
不再返回a list
,所以我们需要将其包装在list
调用中。
versions_list.sort(key=lambda s: list(map(int, s.split('.'))))
这里 map 的替代方法是列表推导式。有关列表推导式的更多信息,请参阅此文章。
versions_list.sort(key=lambda s: [int(u) for u in s.split('.')])
解决方案 3:
natsort提出“自然排序”;其工作方式非常直观(在 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']
解决方案 4:
使用packaging.version
:
from packaging.version import Version
versions = ['3.1', '0.7.1', '3.4.1', '0.7.7', '0.7.2', '3.3', '3.4.0', '0.7',
'0.7.5', '0.7.6', '3.0', '3.3.1', '0.7.3', '3.2', '0.7.4']
versions.sort(key=Version)
结果:
['0.7', '0.7.1', '0.7.2', '0.7.3', '0.7.4', '0.7.5', '0.7.6',
'0.7.7', '3.0', '3.1', '3.2', '3.3', '3.3.1', '3.4.0', '3.4.1']
解决方案 5:
我也使用 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 = list(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'
版本之前'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"]
如果您有任何疑问,请对答案进行评论!
解决方案 6:
versions_list = ["1.1.2", "1.0.0", "1.3.3", "1.0.12", "1.0.2"]
# Sort using `key` where each version string is split into a tuple of integers
versions_list.sort(key=lambda version: tuple(map(int, version.split('.'))))
print(versions_list)
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)