如何按发布顺序排序格式为YY.MM[x]的版本号?
版本排序解决方案
要实现你需要的发布顺序排序(新版本在前),核心是把每个版本字符串拆解为年份、月份、后缀三个可排序字段,然后按「年份降序→月份降序→后缀字母降序」的规则排序。
具体实现思路
- 解析版本字符串:将
YY.MM[x]格式的版本拆分为三个部分:- 年份:
YY转为整数(如22) - 月份:
MM转为整数(如12、9) - 后缀:
x转为ASCII码(如a→97,b→98)
- 年份:
- 自定义排序规则:因为默认排序是升序,我们可以对每个字段取负数,让升序排序等价于原字段的降序排列,从而实现新版本优先的顺序。
Python代码示例
方法1:手动拆分字符串
versions = ["22.11a", "22.12a", "22.9a", "22.12b"] def get_sort_key(version): # 拆分年份和后续部分 year_str, rest = version.split('.') # 分离月份数字和后缀字母 month_str = [] suffix = [] for char in rest: if char.isdigit(): month_str.append(char) else: suffix.append(char) # 转换为排序用的负数值(实现降序) return (-int(year_str), -int(''.join(month_str)), -ord(suffix[0])) sorted_versions = sorted(versions, key=get_sort_key) print(sorted_versions) # 输出: ['22.12b', '22.12a', '22.11a', '22.9a']
方法2:正则表达式解析(更简洁)
import re versions = ["22.11a", "22.12a", "22.9a", "22.12b"] # 匹配年份、月份、后缀的正则 version_regex = re.compile(r'^(\d+)\.(\d+)([a-z])$') sorted_versions = sorted( versions, key=lambda v: ( -int(version_regex.match(v).group(1)), # 年份降序 -int(version_regex.match(v).group(2)), # 月份降序 -ord(version_regex.match(v).group(3)) # 后缀字母降序 ) ) print(sorted_versions) # 输出: ['22.12b', '22.12a', '22.11a', '22.9a']
关键说明
- 月份转为整数后排序,避免字符串排序的逻辑错误(比如字符串
"9"会被判定为大于"12",转为整数后12>9才符合实际月份先后)。 - 后缀字母通过
ord()转为ASCII码,利用字母的ASCII值大小关系(b>a)实现同月份内的版本排序。
内容的提问来源于stack exchange,提问作者Welozbee
相关产品推荐
相关产品推荐

