1. ホーム
  2. python

[解決済み] Pythonでのバージョン番号比較

2023-02-12 03:18:11

質問

を書きたいのですが cmp -のような関数で、二つのバージョン番号を比較して -1 , 0 または 1 を比較した値に基づいています。

  • 戻る -1 バージョンAがバージョンBより古い場合
  • 戻る 0 バージョンAとBが同等であれば
  • 戻る 1 バージョンAがバージョン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を使っています。(私の仕事場にインストールされています...)。

ここに小さな「テストスイート」があります。

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

どのように解決するのですか?

文字列の面白くない部分(末尾の0やドット)を取り除き、数値のリストを比較します。

import re

def mycmp(version1, version2):
    def normalize(v):
        return [int(x) for x in re.sub(r'(\.0+)*$','', v).split(".")]
    return cmp(normalize(version1), normalize(version2))

これはPär Wieslanderと同じアプローチですが、もう少しコンパクトです。

以下は、"のおかげで、いくつかのテストです。 Bashでドット区切りのバージョン形式で2つの文字列を比較する方法は? "です。

assert mycmp("1", "1") == 0
assert mycmp("2.1", "2.2") < 0
assert mycmp("3.0.4.10", "3.0.4.2") > 0
assert mycmp("4.08", "4.08.01") < 0
assert mycmp("3.2.1.9.8144", "3.2") > 0
assert mycmp("3.2", "3.2.1.9.8144") < 0
assert mycmp("1.2", "2.1") < 0
assert mycmp("2.1", "1.2") > 0
assert mycmp("5.6.7", "5.6.7") == 0
assert mycmp("1.01.1", "1.1.1") == 0
assert mycmp("1.1.1", "1.01.1") == 0
assert mycmp("1", "1.0") == 0
assert mycmp("1.0", "1") == 0
assert mycmp("1.0", "1.0.1") < 0
assert mycmp("1.0.1", "1.0") > 0
assert mycmp("1.0.2.0", "1.0.2") == 0