一尘不染

Python精美的int(string,base)反函数

python

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的基数,将“ z”后的ascii字符用作高于36的基数的数字

是否有python内置函数,库函数或更优雅的int(string,base)逆函数?


阅读 153

收藏
2020-12-20

共1个答案

一尘不染

该线程具有一些示例实现。

实际上,我认为您的解决方案看起来不错,甚至可以递归使用,这在某种程度上令人愉悦。

我仍然会简化它以删除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)

我简化了0-9的情况digit_to_char(),我认为str()chr(ord())构造更清晰。为了最大限度地增加与>= 10案件的对称性,ord()可以考虑,但我没有打扰,因为它会增加一条线,简洁性更好。:)

2020-12-20