Python优雅的int(string, base)反向函数

61 投票
12 回答
55848 浏览
提问于 2025-04-15 18:01

Python可以把字符串转换成整数,支持的进制范围是从2到36,使用的方法是:

int(string,base)

我在寻找一个优雅的反向函数,它可以接收一个整数和一个进制,然后返回一个字符串。

举个例子:

>>> str_base(224,15)
'ee'

我想出了以下的解决方案:

def digit_to_char(digit):
    if digit < 10: return chr(ord('0') + digit)
    else: return chr(ord('a') + digit - 10)

def str_base(number,base):
    if number < 0:
        return '-' + str_base(-number,base)
    else:
        (d,m) = divmod(number,base)
        if d:
            return str_base(d,base) + digit_to_char(m)
        else:
            return digit_to_char(m)

注意:digit_to_char()这个函数可以处理小于等于169的进制,对于大于36的进制,它会使用ASCII字符中的z之后的字符作为数字。

有没有Python内置的、库函数,或者更优雅的反向函数来实现int(string,base)的功能呢?

12 个回答

33

如果你在使用Numpy的话,可以用到一个叫做 numpy.base_repr 的功能。

你可以查看这个功能的代码,地址在 numpy/core/numeric.py。代码写得简洁又优雅。

35

也许这不应该算是一个答案,但对某些人来说可能会有帮助:内置的 format 函数可以把数字转换成几种不同进制的字符串:

>>> format(255, 'b') # base 2
'11111111'
>>> format(255, 'd') # base 10
'255'
>>> format(255, 'o') # base 8
'377'
>>> format(255, 'x') # base 16
'ff'
15

这个讨论串里有一些示例实现。

其实我觉得你的解决方案看起来挺不错的,甚至用了递归,这在这里感觉很不错。

我还是会简化一下,去掉 else,不过这可能只是个人风格问题。我觉得 if foo: return 这样写很清楚,不需要后面再加个 else 来说明这是一个不同的分支。

def digit_to_char(digit):
    if digit < 10:
        return str(digit)
    return chr(ord('a') + digit - 10)

def str_base(number,base):
    if number < 0:
        return '-' + str_base(-number, base)
    (d, m) = divmod(number, base)
    if d > 0:
        return str_base(d, base) + digit_to_char(m)
    return digit_to_char(m)

我简化了 digit_to_char() 中处理 0-9 的部分,我觉得用 str()chr(ord()) 这种写法更清晰。为了和 >= 10 的情况保持对称,可以把 ord() 拿出来,但我没这样做,因为那样会多一行代码,简洁一点感觉更好。:)

撰写回答