基于满足条件比较版本字符串的最Pythonic和最有效的方法
我有一个列表,其中包含两个元素[“名称”,“版本”],所有列表的名称都相同基于满足条件比较版本字符串的最Pythonic和最有效的方法,python,python-3.x,python-2.7,version,string-comparison,Python,Python 3.x,Python 2.7,Version,String Comparison,我有一个列表,其中包含两个元素[“名称”,“版本”],所有列表的名称都相同 [[N1, V1] , [N1, V2], [N1, V3], [N1,V4], [N1,V5] .....[N1,Vn] ] 我想要两个版本“Vx”和“Vy”之间的所有[N1,Vi]对满足以下条件: 仅当Vy>Max(Vi)时,检索Vx和Vy之间的[N1,Vi]对 (即版本上限(Vy)大于列表中版本的最大值时) 我试过使用: from distutils.version import LooseVersion, S
[[N1, V1] , [N1, V2], [N1, V3], [N1,V4], [N1,V5] .....[N1,Vn] ]
我想要两个版本“Vx”和“Vy”之间的所有[N1,Vi]对满足以下条件:
仅当Vy>Max(Vi)时,检索Vx和Vy之间的[N1,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)
[“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.如果Vx=(5.5.7)Vy=(9.34.1)
在这种情况下,它将返回Vx和Vy之间版本号的列表
[“pshop”、“6.8.1”]、[“pshop”、“5.6.23.1”]、[“pshop”、“7.6.23.1”]
2.如果Vx=(2.5.7)Vy=(6.0.0)
在这种情况下,它应返回[]作为Vy
使用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 []
[]
来自打包导入版本的>>
>>>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”]
>>>比较λx,y:version.parse(x)>>max_v=max(v代表v,lst中的v)
>>>
>>>Vx=“2.5.7”;Vy=“9.34.1”
>>>[[n,v]如果比较版本(Vx,v)]如果比较版本(max,v,Vy)其他[]
[['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]如果比较版本(Vx,v)]如果比较版本(max,v,Vy)其他[]
[]
使用distutils
:
from distutils.version import LooseVersion
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"]]
ver_x, ver_y = '2.5.7', '6.0.0'
mn, mx = LooseVersion(ver_x), LooseVersion(ver_y)
out = [i for i in lst if mn <= LooseVersion(i[1]) <= mx]
print(out)
与:
印刷品:
[['pshop', '4.6.23.1'], ['pshop', '4.6.10'], ['pshop', '4.0.1'], ['pshop', '5.6.23.1']]
[['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']]
@Andrej Kesely,显然它返回整个输入列表,而不是包含范围之间版本的列表。很抱歉给你带来了困惑。
[['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']]