269

Pythonを使用すると、特定のベースの文字列から整数を簡単に作成できます。

int(str, base). 

逆のことを実行したい:整数からの文字列の作成int2base(num, base)、つまり、次のような関数が必要です。

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

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

受け入れる任意の数とxベース。bint()

これは簡単に記述できる関数です。実際、この質問で説明するよりも簡単です。しかし、何かが足りない気がします。

bin関数、、octについては知っていhexますが、いくつかの理由で使用できません。

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

  • 異なる拠点に対して同じように呼び出すことができる一般的なソリューションが必要です

  • 2、8、16以外の拠点を許可したい

関連している

4

33 に答える 33

112

古いバージョンの Python との互換性が必要な場合は、gmpyを使用できます(高速で完全に一般的な int から文字列への変換関数が含まれており、そのような古いバージョン用にビルドできます。最近のものは由緒ある 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)
于 2010-02-15T16:44:10.387 に答える
110
"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144
于 2010-09-05T19:23:40.340 に答える
97
def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])

参照: http://code.activestate.com/recipes/65212/

につながる可能性がありますのでご注意ください。

RuntimeError: maximum recursion depth exceeded in cmp

非常に大きな整数の場合。

于 2010-02-15T16:41:46.863 に答える
24

再帰的

最も投票された回答を次のように単純化します。

BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(n, b): 
    return "0" if not n else to_base(n//b, b).lstrip("0") + BS[n%b]

RuntimeError: maximum recursion depth exceeded in cmp非常に大きな整数と負の数についても同じアドバイスがあります。(使用できますsys.setrecursionlimit(new_limit)

反復

再帰の問題を回避するには:

BS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
def to_base(s, b):
    res = ""
    while s:
        res+=BS[s%b]
        s//= b
    return res[::-1] or "0"
于 2018-12-07T19:05:51.597 に答える
2

http://code.activestate.com/recipes/65212/

def base10toN(num,n):
    """Change a  to a base-n number.
    Up to base-36 is supported without special notation."""
    num_rep={10:'a',
         11:'b',
         12:'c',
         13:'d',
         14:'e',
         15:'f',
         16:'g',
         17:'h',
         18:'i',
         19:'j',
         20:'k',
         21:'l',
         22:'m',
         23:'n',
         24:'o',
         25:'p',
         26:'q',
         27:'r',
         28:'s',
         29:'t',
         30:'u',
         31:'v',
         32:'w',
         33:'x',
         34:'y',
         35:'z'}
    new_num_string=''
    current=num
    while current!=0:
        remainder=current%n
        if 36>remainder>9:
            remainder_string=num_rep[remainder]
        elif remainder>=36:
            remainder_string='('+str(remainder)+')'
        else:
            remainder_string=str(remainder)
        new_num_string=remainder_string+new_num_string
        current=current/n
    return new_num_string

これは同じリンクからの別のものです

def baseconvert(n, base):
    """convert positive decimal integer n to equivalent in another base (2-36)"""

    digits = "0123456789abcdefghijklmnopqrstuvwxyz"

    try:
        n = int(n)
        base = int(base)
    except:
        return ""

    if n < 0 or base < 2 or base > 36:
        return ""

    s = ""
    while 1:
        r = n % base
        s = digits[r] + s
        n = n / base
        if n == 0:
            break

    return s
于 2010-02-15T16:40:00.210 に答える
0
>>> import string
>>> def int2base(integer, base):
        if not integer: return '0'
        sign = 1 if integer > 0 else -1
        alphanum = string.digits + string.ascii_lowercase
        nums = alphanum[:base]
        res = ''
        integer *= sign
        while integer:
                integer, mod = divmod(integer, base)
                res += nums[mod]
        return ('' if sign == 1 else '-') + res[::-1]


>>> int2base(-15645, 23)
'-16d5'
>>> int2base(213, 21)
'a3'
于 2010-02-15T16:45:34.283 に答える
0
def int2base(a, base, numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    baseit = lambda a=a, b=base: (not a) and numerals[0]  or baseit(a-a%b,b*base)+numerals[a%b%(base-1) or (a%b) and (base-1)]
    return baseit()

説明

a1+a2*base**2+a3*base**3...「使命」は、すべての a を見つけることです。

すべてN=1,2,3...のコードは、 すべての a が N より大きいスライスのaN*base**Nb を「モジュール化」することによってを分離b=base**(N+1) し、現在の によって func が呼び出されるたびに a を減らすことによって、シリアルが N より小さいすべての a をスライスしますaN*base**N

Base%(base-1)==1 したがって base**p%(base-1)==1 および したがって q*base^p%(base-1)==q ただし、q=base-1 の場合は例外が 1 つだけありますこれは 0 を返します。0 を返す場合に、func が最初から 0 をチェックしていることを修正します。


利点

このサンプルでは、​​(除算の代わりに) 1 つの乗算と、比較的短時間しかかからないいくつかの剰余演算しかありません。

于 2016-04-24T12:07:24.643 に答える
0
def base_changer(number,base):
    buff=97+abs(base-10)
    dic={};buff2='';buff3=10
    for i in range(97,buff+1):
        dic[buff3]=chr(i)
        buff3+=1   
    while(number>=base):
        mod=int(number%base)
        number=int(number//base)
        if (mod) in dic.keys():
            buff2+=dic[mod]
            continue
        buff2+=str(mod)
    if (number) in dic.keys():
        buff2+=dic[number]
    else:
        buff2+=str(number)

    return buff2[::-1]   
于 2019-09-08T17:43:50.650 に答える
-1
def baseConverter(x, b):
    s = ""
    d = string.printable.upper()
    while x > 0:
        s += d[x%b]
        x = x / b
    return s[::-1]
于 2016-01-23T20:41:17.307 に答える
-1

これは、符号付き整数とカスタム数字を処理する再帰バージョンです。

import string

def base_convert(x, base, digits=None):
    """Convert integer `x` from base 10 to base `base` using `digits` characters as digits.
    If `digits` is omitted, it will use decimal digits + lowercase letters + uppercase letters.
    """
    digits = digits or (string.digits + string.ascii_letters)
    assert 2 <= base <= len(digits), "Unsupported base: {}".format(base)
    if x == 0:
        return digits[0]
    sign = '-' if x < 0 else ''
    x = abs(x)
    first_digits = base_convert(x // base, base, digits).lstrip(digits[0])
    return sign + first_digits + digits[x % base]
于 2016-12-09T08:53:51.370 に答える