Tôi muốn viết một cmp
chức năng -like mà so sánh hai số phiên bản và lợi nhuận -1
, 0
hoặc 1
dựa trên valuses so họ.
- Quay lại
-1
nếu phiên bản A cũ hơn phiên bản B - Trả lại
0
nếu phiên bản A và B tương đương - Quay lại
1
nế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