Quiero escribir una función similar a cmp
que compara dos números de versión y devuelve -1
, 0
o 1
en función de sus valos comparados.Comparación del número de versión en Python
- Volver
-1
si la versión A es anterior a la versión B - Volver
0
si la versión A y B son equivalentes - Volver
1
si la versión A es más reciente que la versión B
Cada subsección es se supone que debe interpretarse como un número, por lo tanto 1.10> 1.1.
salidas de función deseados son
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
...
Y aquí está mi aplicación, abierto a mejoras:
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
estoy usando Python 2.4.5 cierto. (instalado en mi lugar de trabajo ...).
He aquí una pequeña 'banco de pruebas' se puede utilizar
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
No es una respuesta sino una sugerencia - podría valer la pena implementar el algoritmo de Debian para la versión de la comparación de número (básicamente, alternando la clasificación de no partes numéricas y numéricas). El algoritmo se describe [aquí] (http://www.debian.org/doc/debian-policy/ch-controlfields.html) (comenzando en "Las cuerdas se comparan de izquierda a derecha"). – hobbs
Blargh. El subconjunto de rebajas admitido en los comentarios nunca deja de confundirme. El enlace funciona de todos modos, incluso si parece estúpido. – hobbs
En caso de que los futuros lectores lo necesiten para el análisis sintáctico de la versión del agente de usuario, recomiendo una [biblioteca dedicada] (http://stackoverflow.com/questions/927552/parsing-http-user-agent-string/10109978#10109978) como el variación histórica es demasiado amplia. –