[python] 기본에서 정수를 문자열로 변환하는 방법은 무엇입니까?

파이썬은 주어진 기본 문자열에서 정수를 쉽게 만들 수 있습니다.

int(str, base). 

나는 inverse : integer에서 문자열 생성 을 수행하고 싶습니다. 즉 int2base(num, base), 다음과 같은 함수를 원합니다 .

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

함수 이름 / 인수 순서는 중요하지 않습니다.

어떤 번호 x와 기본 bint() 받아 들일 것입니다.

이것은 작성하기 쉬운 함수입니다. 실제로이 질문에서 설명하는 것보다 쉽습니다. 그러나 뭔가 빠진 것 같아요.

나는 기능에 대해 알고 bin, oct, hex,하지만 몇 가지 이유를 사용할 수 없습니다 :

  • 이 함수는 이전 버전의 Python에서는 사용할 수 없으며 (2.2)와 호환되어야합니다.

  • 다른 기지에 대해 같은 방식으로 호출 할 수있는 일반적인 솔루션을 원합니다.

  • 2, 8, 16 이외의 기지를 허용하고 싶습니다

관련



답변

고대 버전의 Python과의 호환성이 필요한 경우 gmpy 를 사용할 수 있습니다 (빠르고 완전히 일반적인 int-to-string 변환 함수를 포함하고 이러한 고대 버전을 위해 빌드 될 수 있음) 최신 버전은 유능한 Python 및 GMP 릴리스, 일부 최신 버전에 대해서만 테스트되지 않았거나 속도는 느리지 만 편리 성을 위해 Python 코드를 사용하십시오.

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)


답변

놀랍게도 사람들은 작은 염기 (영어 알파벳 길이보다 작은)로 변환하는 솔루션 만 제공하고있었습니다. 2에서 무한대로 임의의 염기로 변환하는 해를 제공하려는 시도는 없었습니다.

다음은 매우 간단한 솔루션입니다.

def numberToBase(n, b):
    if n == 0:
        return [0]
    digits = []
    while n:
        digits.append(int(n % b))
        n //= b
    return digits[::-1]

그래서 당신은베이스에 약간의 슈퍼 거대한 숫자로 변환해야하는 경우 577,

numberToBase(67854 ** 15 - 102, 577)올바른 솔루션을 제공합니다.
[4, 473, 131, 96, 431, 285, 524, 486, 28, 23, 16, 82, 292, 538, 149, 25, 41, 483, 100, 517, 131, 28, 0, 435, 197, 264, 455] ,

나중에 원하는베이스로 변환 할 수있는


답변

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

매우 큰 정수의 경우.


답변

"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144


답변

좋은 답변입니다! 내 질문에 대한 대답이 “아니오”라고 생각합니다. 확실한 해결책이 없었습니다. 다음은 답변에 표현 된 좋은 아이디어를 요약하는 데 사용할 기능입니다.

  • 발신자 제공 문자 매핑 허용 (base64 인코딩 허용)
  • 음수 및 0 확인
  • 복소수를 튜플의 문자열로 매핑

def int2base(x,b,alphabet='0123456789abcdefghijklmnopqrstuvwxyz'):
    'convert an integer to its string representation in a given base'
    if b<2 or b>len(alphabet):
        if b==64: # assume base64 rather than raise error
            alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        else:
            raise AssertionError("int2base base out of range")
    if isinstance(x,complex): # return a tuple
        return ( int2base(x.real,b,alphabet) , int2base(x.imag,b,alphabet) )
    if x<=0:
        if x==0:
            return alphabet[0]
        else:
            return  '-' + int2base(-x,b,alphabet)
    # else x is non-negative real
    rets=''
    while x>0:
        x,idx = divmod(x,b)
        rets = alphabet[idx] + rets
    return rets


답변

재귀

나는 것이다 단순화 대부분의 투표 대답 에를 :

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"


답변

파이썬에는 임의의 기준으로 정수를 인쇄하는 내장 함수가 없습니다. 원한다면 직접 작성해야합니다.