Python优雅的int(string, base)反向函数
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()
拿出来,但我没这样做,因为那样会多一行代码,简洁一点感觉更好。:)