从python中的列表中查找包的最大次要版本

从python中的列表中查找包的最大次要版本,python,python-3.x,version,Python,Python 3.x,Version,我有以下软件包列表,我需要根据bad_版本选择其中一个。例如: bad_version = '1.55' 输出应为'1.61'。但是,如果坏版本是1.61,因为它是列表中的最后一个次要版本,它将选择下一个主要版本的最大值,即'2.9.8'。此外,如果bad_版本为0.55,它将选择下一个主要版本的最大值,即1.61。我将如何在python中实现这一点 def major(version): return int(version.split('.')[0]) def next_majo

我有以下软件包列表,我需要根据bad_版本选择其中一个。例如:

bad_version = '1.55'
输出应为
'1.61'
。但是,如果坏版本是
1.61
,因为它是列表中的最后一个次要版本,它将选择下一个主要版本的最大值,即
'2.9.8'
。此外,如果bad_版本为
0.55
,它将选择下一个主要版本的最大值,即
1.61
。我将如何在python中实现这一点

def major(version):
    return int(version.split('.')[0])

def next_major_version(bad_version, l_versions):
    bad_maj = major(bad_version)
    offset = 0
    candidates = []
    while candidates == []:
        candidates = [v for v in l_versions if major(v) == bad_maj + offset]
        offset += 1
    if candidates[-1] == bad_version:
        candidates = [v for v in l_versions if major(v) == bad_maj + offset]
    return candidates[-1]

l_versions = ['1.54', '1.56', '1.57', '1.58', '1.59', '1.60', '1.61', '2.1.3', '2.5.1', '2.9.8', '3.5.0', '3.5.1', '3.6.0', '3.6.1', '3.7.0', '3.7.0-rc1', '3.7.1']

# returns '1.61'
next_major_version('1.55', l_versions)

# returns '2.9.8'
next_major_version('1.61', l_versions)

# returns '1.61'
next_major_version('0.55', l_versions)

唯一的问题是,如果
坏版本
高于列表中的最高版本,则
while
不会终止。因此,只有在版本列表以某种方式完整的情况下,这才有效。

到目前为止,您尝试了什么?请张贴您的密码。什么不起作用?是您一直正确排序的版本列表,还是有可能未排序?这对我心目中的解决方案有很大的影响,因为对版本号进行排序并不简单…@月它肯定会被排序到列表中,谢谢你的问题。离题:你不应该给
list
指定一个特定的列表,因为在那之后,
l2=list({2,3})
会引起
类型错误,这只是一个变量,但可以被称为其他任何东西,谢谢你的便条,就像一个符咒,非常感谢你@month!!发现另一个错误:如果
bad_version
是主要版本系列的最后一个,并且没有
major(v)==major(bad_version)+1
的版本,我想这将引发
索引器。。。示例:
bad_version='1.51'
l_versions=['1.41'、'1.51'、'3.0'、'3.1']
哦,是的,没问题,我可以处理,谢谢你的提醒。我现在遇到了
的问题,而
没有终止,如何解决这个问题?@JauL你能给我引起这个问题的版本号列表吗?
def major(version):
    return int(version.split('.')[0])

def next_major_version(bad_version, l_versions):
    bad_maj = major(bad_version)
    offset = 0
    candidates = []
    while candidates == []:
        candidates = [v for v in l_versions if major(v) == bad_maj + offset]
        offset += 1
    if candidates[-1] == bad_version:
        candidates = [v for v in l_versions if major(v) == bad_maj + offset]
    return candidates[-1]

l_versions = ['1.54', '1.56', '1.57', '1.58', '1.59', '1.60', '1.61', '2.1.3', '2.5.1', '2.9.8', '3.5.0', '3.5.1', '3.6.0', '3.6.1', '3.7.0', '3.7.0-rc1', '3.7.1']

# returns '1.61'
next_major_version('1.55', l_versions)

# returns '2.9.8'
next_major_version('1.61', l_versions)

# returns '1.61'
next_major_version('0.55', l_versions)