我想写一个cmp样功能,比较两个版本号,并返回-1,0或1根据自己的比较valuses。
cmp
-1
0
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 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