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.短而优雅
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()可以考虑因素,但我没有打扰,因为它会增加一条线,简洁感觉更好.:)
以上答案非常好.它帮助我制作了一个我必须用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)
| 归档时间: |
|
| 查看次数: |
43080 次 |
| 最近记录: |