0 = 0
1 = 1
...
9 = 9
10 = a
11 = b
...
35 = z
36 = A
37 = B
...
60 = Z
61 = 10
62 = 11
...
70 = 19
71 = 1a
72 = 1b
我不知道这叫什么。什么基础?
我想要的只是一个可以将数字转换为这些数字的函数,然后将这些数字转换回数字。
是否有一个简单的功能可以做到这一点?
答案 0 :(得分:4)
>>> int("a", 36)
10
>>> int("z", 36)
35
>>> int("10", 36)
36
另一个方向更复杂,但请尝试this ActiveState recipe。
通常情况下,基本转换不会区分案例。我不确定如何完全扩展这个区别,但配方应该给你一个开始。
答案 1 :(得分:2)
您可以继承numbers.Number:
def baseN(base,alphabet='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'):
class _baseN(numbers.Number):
digits=alphabet[:base]
def __init__(self,value):
if isinstance(value,int):
self.value=value
if self.value==0:
self.string='0'
else:
tmp=[abs(value)]
while tmp[0]!=0:
tmp[:1]=divmod(tmp[0],base)
tmp=[alphabet[i] for i in tmp]
tmp[0]='-' if self.value<0 else ''
self.string=''.join(tmp)
elif isinstance(value,str):
assert(value.isalnum())
self.string=str(value)
self.value=0
for d in value:
self.value=self.value*base+self.digits.index(d)
else:
self.value=0
self.string='0'
def __int__(self):
return self.value
def __str__(self):
return self.string
def __repr__(self):
return self.string
def __add__(self,another):
return self.__class__(self.value+int(another))
return None if base>len(alphabet) else _baseN
发现另一个错误。将其更改为工厂功能。现在可以处理一般情况。