Python优雅的反函数int(字符串,基数)

ran*_*guy 46 python

python允许使用范围[2,36]中的任何基数从字符串转换为整数:

int(string,base)
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个优雅的反函数,它接受一个整数和一个基数并返回一个字符串

例如

>>> str_base(224,15)
'ee'
Run Code Online (Sandbox Code Playgroud)

我有以下解决方案:

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)
Run Code Online (Sandbox Code Playgroud)

注意:digit_to_char()在<z'之后使用ascii字符任意使用<= 169的碱基作为36以上碱基的数字

有没有python内置,库函数,或更优雅的反函数int(字符串,基数)?

etu*_*rdu 30

也许这不应该是一个答案,但它可能对某些人有用:内置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'
Run Code Online (Sandbox Code Playgroud)


Pie*_*con 24

如果你使用Numpy,那就有numpy.base_repr.

你可以阅读下面的代码numpy/core/numeric.py.短而优雅

  • 这是该代码的链接:https://github.com/numpy/numpy/blob/23bc50db7b5d17758cb0a1ce82c3d2fc07164306/numpy/core/numeric.py#L2077-L2130 (2认同)

unw*_*ind 12

该线程有一些示例实现.

实际上我认为你的解决方案看起来相当不错,它甚至是递归的,这在某种程度上令人愉悦.

我仍然会简化它以删除它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)
Run Code Online (Sandbox Code Playgroud)

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


chr*_*hmr 6

以上答案非常好.它帮助我制作了一个我必须用C实现的算法原型

我想提出一点改变(我用过)将十进制转换为符号空间的基数

我也忽略了否定值仅仅是为了简短和数学不正确的事实 - >模块化算术的其他规则 - >其他数学如果你使用二进制,八进制或十六进制 - >在无符号和有符号值的差异

def str_base(number, base):
   (d,m) = divmod(number,len(base))
   if d > 0:
      return str_base(d,base)+base[m]
   return base[m]
Run Code Online (Sandbox Code Playgroud)

导致跟随输出

>>> str_base(13,'01')
'1101'
>>> str_base(255,'01')
'11111111'
>>> str_base(255,'01234567')
'377'
>>> str_base(255,'0123456789')
'255'
>>> str_base(255,'0123456789abcdef')
'ff'
>>> str_base(1399871903,'_helowrd')
'hello_world'
Run Code Online (Sandbox Code Playgroud)

如果你想用你可以使用的propper零符号填充

symbol_space = 'abcdest'

>>> str_base(734,symbol_space).rjust(0,symbol_space[0])
'catt'
>>> str_base(734,symbol_space).rjust(6,symbol_space[0])
'aacatt'
Run Code Online (Sandbox Code Playgroud)