Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于满足条件比较版本字符串的最Pythonic和最有效的方法_Python_Python 3.x_Python 2.7_Version_String Comparison - Fatal编程技术网

基于满足条件比较版本字符串的最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']]