Je souhaite écrire une fonction similaire à cmp
qui compare deux numéros de version et renvoie -1
, 0
ou 1
en fonction de leurs valeurs de comparaison.Comparaison des numéros de version en Python
- Retour
-1
si la version A est plus ancienne que la version B - Retour
0
si la version A et B sont équivalentes - Retour
1
si la version A est plus récente que la version B
Chaque paragraphe est supposé être interprété comme un nombre, donc 1.10> 1.1.
sorties de fonction souhaitées sont
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
...
Et voici ma mise en œuvre, ouvert à l'amélioration:
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
J'utilise Python 2.4.5 btw. (installé à mon lieu de travail ...).
Voici une petite 'suite de tests', vous pouvez utiliser
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
Pas une réponse, mais une suggestion - il pourrait être utile mise en oeuvre de l'algorithme de Debian pour la comparaison de numéro de version (essentiellement, en alternant le tri des non parties numériques et numériques). L'algorithme est décrit [ici] (http://www.debian.org/doc/debian-policy/ch-controlfields.html) (en commençant par "Les chaînes sont comparées de gauche à droite"). – hobbs
Blargh. Le sous-ensemble de démarque pris en charge dans les commentaires ne manque jamais de me dérouter. Le lien fonctionne quand même, même si ça a l'air stupide. – hobbs
Si les futurs lecteurs en ont besoin pour l'analyse de la version user-agent, je recommande une [bibliothèque dédiée] (http://stackoverflow.com/questions/927552/parsing-http-user-agent-string/10109978#10109978) en tant que variation historique trop large. –