如何用Python从列表中提取各服务的最新版本?
提取各服务的最新版本解决方案
针对你给出的版本列表,直接对版本字符串排序会因为ASCII顺序和语义化版本规则不符导致错误(比如beta的ASCII码比rc小,字符串排序会把v1.1.0.10-beta1排在v1.1.0.10-rc1前面,但实际后者版本更高)。可以用Python的packaging库来正确解析和比较语义化版本,步骤如下:
步骤说明
- 拆分每个条目,分离服务标识(比如
base/domain/service1)和版本号(比如v1.1.0.10-rc1) - 按服务标识分组,收集每个服务的所有版本
- 使用
packaging.version.Version类解析版本,该类会遵循语义化版本规则进行比较,选出每个服务的最高版本
代码实现
from packaging.version import Version from collections import defaultdict LIST = [ "base/domain/service1:v1.1.0.10-rc1", "base/domain/service1:v1.1.0.10-beta1", "base/domain/service1:v1.1.0.8-beta2", "base/domain/service1:v1.1.0.7", "base/domain/service2:v1.1.0.10-rc1", "base/domain/service2:v1.1.0.10-beta1", "base/domain/service2:v1.1.0.8-beta2", "base/domain/service2:v1.1.0.7" ] # 按服务分组存储版本 service_versions = defaultdict(list) for item in LIST: service, version = item.split(":", 1) service_versions[service].append(version) # 提取每个服务的最新版本 max_versions = {} for service, versions in service_versions.items(): # 用Version类解析后排序,取最后一个(最大版本) sorted_versions = sorted(versions, key=lambda v: Version(v)) max_versions[service] = sorted_versions[-1] # 输出结果 for service, max_v in max_versions.items(): print(f"{service}: max_version = {max_v}")
运行结果
base/domain/service1: max_version = v1.1.0.10-rc1 base/domain/service2: max_version = v1.1.0.10-rc1
为什么这个方法可行
packaging.version.Version会将版本号拆分为核心版本、预发布标签等部分,按照语义化版本的优先级规则比较:
- 核心版本数字部分从左到右比较(比如
1.1.0.10>1.1.0.8) - 预发布标签的优先级:
rc>beta>alpha,所以v1.1.0.10-rc1会被判定为比v1.1.0.10-beta1更高的版本
如果没有安装packaging库,先执行安装命令:
pip install packaging
内容的提问来源于stack exchange,提问作者sagar
相关产品推荐
相关产品推荐

