Pythonでバージョン番号を比較する方法を解説
プログラム開発では、2つのバージョン番号を比較する場面がよくあります。本記事では、Pythonを使ってバージョン番号version1とversion2を比較するアルゴリズムを解説します。
問題の概要
2つのバージョン番号version1とversion2が与えられたとき、以下のルールに従って結果を返します。
- version1 > version2 の場合は 1 を返す
- version1 < version2 の場合は -1 を返す
- それ以外(等しい場合)は 0 を返す
前提条件
この問題では、以下の条件が成り立つと仮定できます。
- バージョン文字列は空ではなく、数字とドット(.)のみを含む
- ドットは小数点を表すものではなく、数値の区切りとして使用される
つまり、「2.5」は「2と半分」や「バージョン3への途中」という意味ではなく、第1レベルリビジョンが2、第2レベルリビジョンが5であることを意味します。
また、各レベルのデフォルトのリビジョン番号は0とみなせます。例えば、バージョン番号「3.4」の場合、第1レベルのリビジョン番号は3、第2レベルは4であり、第3レベルと第4レベルのリビジョン番号はどちらも0です。
例えば、入力が version1 = "1.0.1"、version2 = "1" の場合、出力は +1 になります。これは、第3レベルのリビジョン番号を0とみなして「1.0.1」と「1.0.0」を比較したとき、前者の方が大きいためです。
解決手順
この問題を解くには、以下の手順に従います。
- version1をドットで分割し、整数の配列version1_arrを作成する
- version2も同様にドットで分割し、配列version2_arrを作成する
- iを0からversion1_arrとversion2_arrのサイズの最大値まで繰り返す
- v1 := iがversion1_arrのサイズ未満ならversion1_arr[i]、そうでなければ0
- v2 := iがversion2_arrのサイズ未満ならversion2_arr[i]、そうでなければ0
- v1 > v2 なら 1 を返し、v1 < v2 なら -1 を返す
- ループが完了したら 0 を返す
Pythonでの実装例
理解を深めるために、実際の実装を見てみましょう。
class Solution:
def compareVersion(self, version1, version2):
versions1 = [int(v) for v in version1.split(".")]
versions2 = [int(v) for v in version2.split(".")]
for i in range(max(len(versions1), len(versions2))):
v1 = versions1[i] if i < len(versions1) else 0
v2 = versions2[i] if i < len(versions2) else 0
if v1 > v2:
return 1
elif v1 < v2:
return -1
return 0
ob1 = Solution()
print(ob1.compareVersion("1.0.1", "1.0"))
入力
"1.0.1" "1.0"
出力
1
コードのポイント
この実装の重要なポイントは以下の通りです。
- split(".")による分割: バージョン文字列をドットで分割し、各レベルのリビジョン番号を整数のリストに変換します。
- 長さの違いへの対応: 「1.0.1」と「1.0」のように桁数が異なるバージョンでも、足りない部分を0として補完することで正しく比較できます。
- zip_longestの代替手法: 標準ライブラリのitertools.zip_longestを使えば、より簡潔に書くことも可能です。
このアルゴリズムの計算量はO(n)(nはバージョン文字列の長さ)であり、非常に効率的です。パッケージ管理システムやアップデートチェック機能など、さまざまな場面で応用できる基本的なテクニックなので、ぜひマスターしておきましょう。
-
Pythonで乱数を生成する方法|randomモジュールの主要関数を解説
Pythonには乱数を生成するための関数がいくつか用意されています。これらの関数は、ゲームや抽選など、ランダムな数値が必要となるさまざまな場面で活用できます。乱数を使うには、まず random モジュールをインポートする必要があります。import random以下に、代表的な乱数生成関数を紹介します。choice() – リストから1つの要素をランダムに選択choice() 関数は、数値のコレクション(リストなど)から1つの要素をランダムに選んで返します。サンプルコードprint (リストから選ばれた乱数 : ,end=) print (random.choice([1, 4, 6, 10
-
Pythonで数値を比較する方法をわかりやすく解説!関係演算子の使い方
Pythonでは、関係演算子(比較演算子)を使うことで、数値(int型・float型のどちらでも)を簡単に比較できます。これらの演算子は、左右の値を比較し、その関係性を判定した結果として True または False を返します。 例として、変数 a に 10、変数 b に 20 が代入されている場合、各演算子の動作は以下のようになります。 Pythonの主な関係演算子一覧 演算子意味例(a=10, b=20) ==等しい(a == b) は False(等しくないため) !=等しくない(a != b) は True >より大きい(a > b) は False <よ