【发布时间】:2010-12-15 09:39:06
【问题描述】:
我想编写一个类似cmp 的函数,它比较两个版本号并根据它们的比较值返回-1、0 或1。
- 如果版本 A 比版本 B 旧,则返回
-1 - 如果版本 A 和 B 相同,则返回
0 - 如果版本 A 比版本 B 新,则返回
1
每个小节都应该被解释为一个数字,因此 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 顺便说一句。 (安装在我的工作地点...)。
这是一个您可以使用的小型“测试套件”
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
【问题讨论】:
-
不是一个答案,而是一个建议——可能值得实现 Debian 的版本号比较算法(基本上,非数字和数字部分的交替排序)。该算法描述为here(从“字符串从左到右比较”开始)。
-
布拉格。 cmets 中支持的降价子集永远不会让我感到困惑。该链接仍然有效,即使它看起来很愚蠢。
-
如果未来的读者需要这个来解析用户代理版本,我推荐dedicated library,因为它的历史变化太宽了。
-