Python中的版本号比较 [英] Version number comparison in Python
问题描述
我想编写一个类似 cmp
的函数,它比较两个版本号并返回 -1
、0
或 1
基于它们的比较值.
I want to write a cmp
-like function which compares two version numbers and returns -1
, 0
, or 1
based on their compared valuses.
- 如果版本 A 比版本 B 旧,则返回
-1
- 如果版本 A 和 B 等效,则返回
0
- 如果版本 A 比版本 B 新,则返回
1
每个小节都应该被解释为一个数字,因此 1.10 > 1.1.
Each subsection is supposed to be interpreted as a number, therefore 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
...
这是我的实现,有待改进:
And here is my implementation, open for improvement:
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.(安装在我的工作地点......).
I'm using Python 2.4.5 btw. (installed at my working place ...).
这是一个您可以使用的小型测试套件"
Here's a small 'test suite' you can use
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
推荐答案
删除字符串中不感兴趣的部分(尾随零和点),然后比较数字列表.
Remove the uninteresting part of the string (trailing zeroes and dots), and then compare the lists of numbers.
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är Wieslander 的方法相同,但更紧凑:
This is the same approach as Pär Wieslander, but a bit more compact:
这里有一些测试,感谢如何在 Bash 中比较点分隔版本格式的两个字符串?":
Here are some tests, thanks to "How to compare two strings in dot separated version format in 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
这篇关于Python中的版本号比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!