当前位置: 首页 > 面试题库 >

Python中的版本号比较

拓拔泉
2023-03-14
问题内容

我想写一个cmp样功能,比较两个版本号,并返回-101根据自己的比较valuses。

  • -1如果版本A早于版本B,则返回
  • 返回0如果版本A和B是等价的
  • 1如果版本A比版本B更新,则返回

每个小节都应解释为一个数字,因此1.10> 1.1。

所需的功能输出为

mycmp('1.0', '1') == 0
mycmp('1.0.0', '1') == 0
mycmp('1', '1.0.0.1') == -1
mycmp('12.10', '11.0.0.0.0') == 1
...

这是我的实现,有待改进:

def mycmp(version1, version2):
    parts1 = [int(x) for x in version1.split('.')]
    parts2 = [int(x) for x in version2.split('.')]

    # fill up the shorter version with zeros ...
    lendiff = len(parts1) - len(parts2)
    if lendiff > 0:
        parts2.extend([0] * lendiff)
    elif lendiff < 0:
        parts1.extend([0] * (-lendiff))

    for i, p in enumerate(parts1):
        ret = cmp(p, parts2[i])
        if ret: return ret
    return 0

我正在使用Python 2.4.5 btw。(安装在我的工作地点…)。

这是您可以使用的小型“测试套件”

assert mycmp('1', '2') == -1
assert mycmp('2', '1') == 1
assert mycmp('1', '1') == 0
assert mycmp('1.0', '1') == 0
assert mycmp('1', '1.000') == 0
assert mycmp('12.01', '12.1') == 0
assert mycmp('13.0.1', '13.00.02') == -1
assert mycmp('1.1.1.1', '1.1.1.1') == 0
assert mycmp('1.1.1.2', '1.1.1.1') == 1
assert mycmp('1.1.3', '1.1.3.000') == 0
assert mycmp('3.1.1.0', '3.1.2.10') == -1
assert mycmp('1.1', '1.10') == -1

问题答案:

删除字符串的多余部分(尾随零和点),然后比较数字列表。

import re

def mycmp(version1, version2):
    def normalize(v):
        return [int(x) for x in re.sub(r'(\.0+)*$','', v).split(".")]
    return cmp(normalize(version1), normalize(version2))

这与PärWieslander的方法相同,但更为紧凑:

这里有一些测试,这要感谢“如何在Bash中比较点分隔版本格式的两个字符串? ”:

assert mycmp("1", "1") == 0
assert mycmp("2.1", "2.2") < 0
assert mycmp("3.0.4.10", "3.0.4.2") > 0
assert mycmp("4.08", "4.08.01") < 0
assert mycmp("3.2.1.9.8144", "3.2") > 0
assert mycmp("3.2", "3.2.1.9.8144") < 0
assert mycmp("1.2", "2.1") < 0
assert mycmp("2.1", "1.2") > 0
assert mycmp("5.6.7", "5.6.7") == 0
assert mycmp("1.01.1", "1.1.1") == 0
assert mycmp("1.1.1", "1.01.1") == 0
assert mycmp("1", "1.0") == 0
assert mycmp("1.0", "1") == 0
assert mycmp("1.0", "1.0.1") < 0
assert mycmp("1.0.1", "1.0") > 0
assert mycmp("1.0.2.0", "1.0.2") == 0


 类似资料:
  • 问题内容: 我正在走一个包含鸡蛋的目录,将这些鸡蛋添加到sys.path。如果目录中有相同.egg的两个版本,我只想添加最新的一个。 我有一个正则表达式·可以从文件名中提取名称和版本。问题是比较版本号,它是一个类似的字符串2.3.1。 由于我在比较字符串,所以2在10之上排序,但这对于版本是不正确的。 我可以进行一些拆分,解析,转换为int等操作,最终得到解决方法。但这是Python,而不是Jav

  • 我正在浏览一个包含鸡蛋的目录,以将这些鸡蛋添加到。如果目录中有同一个.egg的两个版本,我只想添加最新版本。 我有一个正则表达式

  • 以下的宏为configure脚本管理版本号。使用它们是可选的。 宏: AC_PREREQ version) 确保使用的是足够新的Autoconf版本。如果用于创建configure的Autoconf的版本比version 要早,就在标准错误输出打印一条错 误消息并不会创建configure。例如:AC—PREREQ(1.8) 如果你的'configure.in'依赖于在不同Autoconf版本中改

  • +++ get:/ <<< success { "code":1, "msg":"恭喜您,API访问成功!", "data":{ "version":"1.0.0", "doc":"http://www.kancloud.cn/thinkcmf/cmf5api" } } +++

  • 问题内容: 我有两个字符串(它们实际上是版本号,它们可以是任何版本号) 我想比较哪个更大。在golang中如何做? 问题答案: 将“ 1.05.00.0156”转换为“ 0001” +“ 0005” +“ 0000” +“ 0156”,然后转换为int64。 将“ 1.0.221.9289”转换为“ 0001” +“ 0000” +“ 0221” +“ 9289”,然后转换为int64。 比较两个

  • 问题内容: 我有一个与设备固件通信的应用程序。由于固件发生更改,因此使用格式对其进行了版本控制。举几个例子,当前版本是,之后是,有时是。不幸的是,固件的版本控制格式不受我的控制,因此我无法更改它。 我需要一种相互比较固件的方法。基本上我需要一个功能 到目前为止,我所做的就是将这种格式转换为简单格式。因此将变为(每个级别2位数字)。问题是 我的代码难以阅读(> 40行和3种方法) 我敢肯定,对此有一