HOWTO · Python

Python でローマ数字を整数に変換する

この記事では、Python でローマ数字を整数に変換する方法について説明します。 これを行うには、Python の if ステートメントを使用します。 また、Python でローマ数字を整数に変更する方法をさらにいくつか調べます。

このページの内容

子供の頃、私たちは皆、ローマ数字を整数に変換する方法を学びました。 さて、私たちがプログラマーになったら、これを行う Python プログラムを作成しましょう。

この記事では、Python を使用してローマ数字を整数に変換する方法を学習します。

Python でローマ数字を整数に変換する

実際のコードに飛び込む前に、ローマ数字を整数に変換する規則を修正しましょう。 特定の整数に使用される基本的な記号は次のとおりです。

Integer      Roman Numeral
   1               I
   5               V
   10              X
   50              L
   100             C
   500             D
   1000            M

与えられたローマ数字の文字列から整数の対応する値を見つけることができることを知っています。 しかし、そうするときは、いくつかの規則に従わなければなりません。

  1. 与えられたローマ数字の文字列について、左から右に移動する際に、記号の値が減少するか同じままである場合、それらに相当する整数を加算して、最終的な答えを整数として取得します。

    XVII
    
    X - 10
    V - 5
    I - 1
    I - 1
    
    10 + 5 + 1 + 1 = 17
    

    上記の例では、値は左から右に減少します。 したがって、それらをすべて加算すると、整数値として 17 が得られます。

  2. 与えられたローマ数字の文字列について、左から右に移動する際に記号の値が増加する場合、大きな値から小さな値に相当する整数を減算して、最終的な答えを整数として取得します。

    XL
    
    X - 10
    L - 50
    
    50 - 10 = 40
    

    上記の例では、値は左から右に増加します。 したがって、それらを減算して、整数値として 40 を取得します。

ローマ数字を整数に変換するコードを作成する際には、これら 2つの規則を覚えておく必要があります。 また、辞書以外にも、ローマ数字を整数に変換する方法がいくつかあります。

それらを1つずつ見てみましょう。

Python でローマ数字を整数に変換する Python プログラム

ローマ数字を整数に変換する最も簡単な方法は、if ステートメントを使用して基本的なローマ記号を格納することです。 これが同じコードです。

# function to store the basic roman symbols
def map_symbols(s):
    if s == "I":
        return 1
    if s == "V":
        return 5
    if s == "X":
        return 10
    if s == "L":
        return 50
    if s == "C":
        return 100
    if s == "D":
        return 500
    if s == "M":
        return 1000
    return -1


# function to perform the conversion
def change_roman_to_int(roman):
    ans = 0
    i = 0

    while i < len(roman):
        x1 = map_symbols(roman[i])

        if i + 1 < len(roman):
            x2 = map_symbols(roman[i + 1])

            if x1 >= x2:
                ans = ans + x1
                i = i + 1
            else:
                ans = ans + x2 - x1
                i = i + 2

        else:
            ans = ans + x1
            i = i + 1

    return ans


# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))

出力:

Enter the roman numeral: MLXVI
The integer equivalent is:
1066

このコードの動作を見てみましょう。

入力としてローマン文字列を入力すると、変数 r に格納され、関数 change_roman_to_int に渡されます。 この関数内で while ループを使用して、文字列全体を反復処理します。

さらに、while ループが各値を処理するとき、while ループ内の if-else ステートメントは次の処理を行います。

  1. 現在のシンボルの値が次のシンボルの値以上の場合、現在の値が変数 ans に追加されます。
  2. それ以外の場合、次のシンボルの値が変数 ans に追加され、現在の値がそこから減算されます。

これは基本的に、このコードがどのように機能するかです。

Python 辞書を使用してローマ数字を整数に変換する別の方法を見てみましょう。

Python 辞書を使用して Python でローマ数字を整数に変換する

ここでも、基本的な考え方は変わりません。 唯一の変更点は、if ステートメントの代わりに、辞書を使用してローマ数字とそれに対応する整数値を保存することです。

これが同じコードです。

# function to convert roman numeral into an integer
def change_roman_to_int(roman):

    # dictionary to store the roman-integer values
    map_symbols = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}

    ans = 0
    for i in range(len(roman)):
        if i > 0 and map_symbols[roman[i]] > map_symbols[roman[i - 1]]:
            ans += map_symbols[roman[i]] - 2 * map_symbols[roman[i - 1]]
        else:
            ans += map_symbols[roman[i]]
    return ans


# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))

出力:

Enter the roman numeral: MMMCMLXX
The integer equivalent is:
3970

for ループまたは while ループを使用して入力文字列を反復処理できることに注意してください。どちらも同様に機能するためです。

以下のコードのように、辞書で enumerate 関数を使用することもできます。

# function to convert roman numeral into an integer
def change_roman_to_int(roman):

    # dictionary to store the roman-integer values
    map_symbols = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}

    ans = 0
    l = len(roman)
    for (i, v) in enumerate(roman):
        if i < l - 1 and map_symbols[v] < map_symbols[roman[i + 1]]:
            ans -= map_symbols[v]
        else:
            ans += map_symbols[v]

    return ans


# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))

出力:

Enter the roman numeral: MCMXCIV
The integer equivalent is:
1994

辞書には 7つの基本的なローマ字記号のみを追加しています。 カスタム シンボルを追加すると、コードをさらに簡素化できます。

以下のコードを見てください。

# function to change a roman numeral into an integer
def change_roman_to_int(roman):
    custom_symbols = {"IV": -2, "IX": -2, "XL": -20, "XC": -20, "CD": -200, "CM": -200}
    map_symbols = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
    ans = 0

    for i in roman:
        ans += map_symbols[i]

    for i in range(len(roman) - 1):
        merge = str(roman[i] + roman[i + 1])
        if merge in custom_symbols:
            ans += custom_symbols[merge]

    return ans


# driver code
r = input("Enter the roman numeral: ")
print("The integer equivalent is: ")
print(change_roman_to_int(r))

出力:

Enter the roman numeral: MCMXCIV
The integer equivalent is:
1994

このコードの巧妙さに驚きませんか? このコードがどのように機能するか見てみましょう。

change_roman_to_int 関数内には、2つの辞書があります。通常の 7つの値を持つ map_symbols 辞書と、ローマ字のペアに対応する負の値を持つ custom_symbols 辞書です。

さらに、最初の for ループは、すべてのローマ字記号の整数値を加算し、合計を変数 ans に格納します。 このステップは次のようになります。

MCMXCIV
M = 1000, C = 100, M = 1000, X = 10, C = 100, I = 1, V = 5

1000 + 100 + 1000 + 10 + 100 + 1 + 5 = 2216
ans = 2216

次に、2 番目の for ループが roman 文字列を繰り返し処理し、一度に 2つのシンボルを取得して変数 merge に文字列として格納します。 この for ループ内の if ステートメントは、マージされたペアが辞書 custom_symbols に存在するかどうかをチェックします。

見つかった場合、対応する負の値が変数 ans に追加されます。 このステップは次のようになります。

MC - Not found

CM - Found
ans = 2216 + (-200)
ans = 2016

MX - Not found

XC - Found
ans = 2016 + (-20)
ans = 1996

CI - Not found

IV - Found
ans = 1996 + (-2)
ans = 1994

これは基本的に、このコードがどのように機能するかです。

私たちは長い間このコードを書いてきました。 それでは、座って Python に仕事をさせましょう。

Python Roman モジュールを使用して Python でローマ数字を整数に変換する

Python を使用していて、ローマ数字を整数に変換する関数を備えたモジュールが存在する必要があることを知らないでしょうか? さて、そのモジュールは roman と呼ばれています。

このモジュールをダウンロードするには、cmd で次のコマンドを実行します。

pip install roman

出力:

Downloading roman-3.3-py2.py3-none-any.whl (3.9 kB)
Installing collected packages: roman
Successfully installed roman-3.3

モジュールがインストールされると、上記のメッセージが表示されます。

これで、このモジュールをコードにインポートし、関数 fromRoman() を使用して任意のローマ数字を整数に変換できます。

import roman

x = roman.fromRoman("MCMXCIV")
print(x)

出力:

1994

Python の roman モジュールの詳細については、この リンクを参照してください。

まとめ

この記事では、Python でローマ数字を整数に変換する非常に興味深い方法をいくつか見てきました。 これを実現するために、Python の if ステートメントと Python 辞書を使用しました。

また、ローマンペアに負の値を使用して、コードをより簡単かつ短くする方法についても調べました。 最後に、fromRoman() 関数を使用してローマ数字を整数に変換する Python の roman モジュールの使用を見ました。