Я хочу написать cmp
-подобную функцию, которая сравнивает два номера версий и возвращает -1
, 0
или 1
на основе их сравниваемых значений.Сравнение номеров версий в Python
- Возврат
-1
если версия старше версии B - Возврат
0
если версия А и В эквивалентны - Return
1
если версия новее, чем версия B
Каждый подраздел является предполагается интерпретироваться как число, поэтому 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
не ответ, но предложение - это могло бы стоить реализации алгоритма в Debian для номера версии сравнения (в основном, чередуя сортировка не- числовые и числовые части). Алгоритм описан [здесь] (http://www.debian.org/doc/debian-policy/ch-controlfields.html) (начиная с «Строки сравниваются слева направо»). – hobbs
Blargh. Подмножество уценки, поддержанное в комментариях, никогда не перестает меня путать. Ссылка работает в любом случае, даже если это выглядит глупо. – hobbs
В случае, если будущие читатели нуждаются в этом для разбора версии агента пользователя, я рекомендую [выделенную библиотеку] (http://stackoverflow.com/questions/927552/parsing-http-user-agent-string/10109978#10109978) в качестве историческая вариация слишком широка. –