1. ホーム
  2. パイソン

[解決済み】任意の基数の整数を文字列に変換する方法は?

2022-04-02 02:15:53

質問

Pythonでは、指定した基数の文字列から、以下の方法で簡単に整数を作成できます。

int(str, base). 

逆行列を行いたいのですが。 整数から文字列を生成する , つまり、何らかの関数 int2base(num, base) というようなものである。

int(int2base(x, b), b) == x

関数名/引数の順番は重要ではありません。

任意の数 x とベース b その int() を受け入れることになります。

これは簡単に書ける関数です。実際、この質問で説明するよりも簡単です。しかし、私は何かを見逃しているような気がします。

私は、以下の関数について知っています。 bin , oct , hex が、いくつかの理由で使えません。

  • これらの関数は、互換性が必要な古いバージョンのPythonでは利用できない (2.2)。

  • 異なるベースに対して同じ方法で呼び出すことができる一般的なソリューションが必要です。

  • 2,8,16以外の塩基を許容したい

関連

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

古いバージョンのPythonとの互換性が必要な場合、以下のどちらかを使用することができます。 gmpy (これは高速で完全に一般的な int-to-string 変換関数を含んでおり、そのような古いバージョン用にビルドすることができます。最近のものは由緒ある Python や GMP リリースに対してテストされておらず、やや最近のものだけなので、古いリリースを試す必要があるかもしれません) あるいは、速度が落ちるがより便利にするためには Python コード - 例えば Python 2 では最も単純に - を使うことができます。

import string
digs = string.digits + string.ascii_letters


def int2base(x, base):
    if x < 0:
        sign = -1
    elif x == 0:
        return digs[0]
    else:
        sign = 1

    x *= sign
    digits = []

    while x:
        digits.append(digs[int(x % base)])
        x = int(x / base)

    if sign < 0:
        digits.append('-')

    digits.reverse()

    return ''.join(digits)

Python 3 の場合。 int(x / base) は正しくない結果を導くので、次のように変更する必要があります。 x // base :

import string
digs = string.digits + string.ascii_letters


def int2base(x, base):
    if x < 0:
        sign = -1
    elif x == 0:
        return digs[0]
    else:
        sign = 1

    x *= sign
    digits = []

    while x:
        digits.append(digs[x % base])
        x = x // base

    if sign < 0:
        digits.append('-')

    digits.reverse()

    return ''.join(digits)