如何将整数转换为任意基数的字符串?

新手上路,请多包涵

Python 允许通过以下方式从给定基数的字符串轻松创建整数

int(str, base).

我想执行相反的操作: 从整数创建字符串,即我想要一些函数 int2base(num, base) ,这样:

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

函数名称/参数顺序并不重要。

对于任何数字 x 和 base b int() 将接受。

这是一个易于编写的函数:实际上它比在这个问题中描述它更容易。但是,我觉得我必须遗漏一些东西。

我知道函数 binocthex ,但我不能使用它们有几个原因:

  • 这些函数在旧版本的 Python 上不可用,我需要与 (2.2) 兼容

  • 我想要一个通用的解决方案,可以针对不同的基础以相同的方式调用

  • 我想允许 2、8、16 以外的基数

有关的

原文由 Mark Borgerding 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 344
2 个回答

如果您需要与旧版本的 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)

原文由 Alex Martelli 发布,翻译遵循 CC BY-SA 4.0 许可协议

令人惊讶的是,人们只给出了转换为小碱基(小于英文字母表的长度)的解决方案。没有尝试给出一个解决方案,可以转换为从 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]

您可以稍后将其转换为您想要的任何基地

  1. 在某些时候你会注意到有时没有内置的库函数来做你想做的事情,所以你需要自己写。如果您不同意,请发布您自己的带有内置函数的解决方案,该函数可以将 10 进制数转换为 577 进制数。
  2. 这是由于不了解某些基础中的数字的含义。
  3. 我鼓励您思考一下为什么您的方法中的 base 仅适用于 n <= 36。完成后,很明显为什么我的函数返回一个列表并具有它的签名。

原文由 Salvador Dali 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题