Tôi muốn viết một cmpchức năng -like mà so sánh hai số phiên bản và lợi nhuận -1, 0hoặc 1dựa trên valuses so họ.
- Quay lại
-1nếu phiên bản A cũ hơn phiên bản B - Trả lại
0nếu phiên bản A và B tương đương - Quay lại
1nếu phiên bản A mới hơn phiên bản B
Mỗi tiểu mục được hiểu là một số, do đó 1.10> 1.1.
Đầu ra chức năng mong muốn là
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
...
Và đây là cách triển khai của tôi, đang mở để cải thiện:
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
Tôi đang sử dụng Python 2.4.5 btw. (được lắp đặt tại nơi làm việc của tôi ...).
Đây là một 'bộ thử nghiệm' nhỏ mà bạn có thể sử dụng
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