python - 基于满足条件比较版本字符串的最 Pythonic 和有效的方法
问题描述
我有一个列表列表,其中包含两个元素 ["Name", "Version"],所有列表的名称都相同。
[[N1, V1] , [N1, V2], [N1, V3], [N1,V4], [N1,V5] .....[N1,Vn] ]
我想要满足以下条件的两个版本 'Vx' 和 'Vy' 之间的所有 [N1,Vi] 对:
仅在以下情况下检索 Vx 和 Vy 之间的 [N1,Vi] 对: Vy > Max(Vi)
(即版本上限(Vy)大于列表中版本的最大值时)
我试过使用:
from distutils.version import LooseVersion, StrictVersion
但我只能找到布尔结果。
[["pshop","4.6.23.1"], ["pshop","4.6.10"], ["pshop","4.0.1"],
["pshop","6.8.1"], ["pshop","5.6.23.1"], ["pshop","7.6.23.1"]]
1. If Vx = (5.5.7) Vy = (9.34.1)
In this case it will return lists which have version numbers between Vx and Vy
[["pshop","6.8.1"], ["pshop","5.6.23.1"], ["pshop","7.6.23.1"]]
2. If Vx = (2.5.7) Vy = (6.0.0)
In this case it should return [] as Vy < max(Vi) (6.0.0 < 7.6.23.1)
解决方案
用于version.parse
解析和比较版本,并使用列表推导过滤所需的版本
>>> from packaging import version
>>> lst = [["pshop","4.6.23.1"], ["pshop","4.6.10"], ["pshop","4.0.1"], ["pshop","6.8.1"], ["pshop","5.6.23.1"], ["pshop","7.6.23.1"]]
>>> compare_ver = lambda x,y: version.parse(x) < version.parse(y)
>>> max_v = max(v for _,v in lst)
>>>
>>> Vx = "2.5.7"; Vy = "9.34.1"
>>> [[n,v] for n,v in lst if compare_ver(Vx, v)] if compare_ver(max_v, Vy) else []
[['pshop', '4.6.23.1'], ['pshop', '4.6.10'], ['pshop', '4.0.1'], ['pshop', '6.8.1'], ['pshop', '5.6.23.1'], ['pshop', '7.6.23.1']]
>>>
>>> Vx = "2.5.7"; Vy = "6.0.0"
>>> [[n,v] for n,v in lst if compare_ver(Vx, v)] if compare_ver(max_v, Vy) else []
[]
推荐阅读
- mysql - Mysql用JSON数组重写列
- java - 为什么主类中的 LauncherImpl.launchApplication() (javaFX 启动器)正在启动 InvocationTargetException 而没有调用 launch()?
- javascript - 基于相似对象值匹配 json 对象时出错
- excel - 遍历过滤范围与检查每一行
- azure-devops - 为什么我的 azure devops 变量没有被评估为 bool?
- robo3t - 如何设置 Robo3T 的默认视图?
- jupyter-notebook - EMR jupyter笔记本选项卡完成/自动完成?
- java - 我什么时候使用 HandlerInterceptor 和 ClientHttpRequestInterceptor?
- angular - 运行“ng serve”时抛出“复合选择器可能不再被扩展”错误。
- reactjs - Tone.js 中的路径和采样器循环