0
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

我不知道这叫什么。根据什么?

我想要的只是一个可以将数字转换为这些数字并将这些数字转换回数字的函数。

有没有一个简单的功能可以做到这一点?

4

2 回答 2

4
>>> int("a", 36)
10
>>> int("z", 36)
35
>>> int("10", 36)
36

另一个方向更复杂,但试试这个 ActiveState recipe

通常基本转换不区分大小写。我不确定如何完全扩展它以做出这种区分,但这个食谱应该让你开始。

于 2010-12-04T01:47:21.283 回答
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

发现另一个错误。将其更改为工厂功能。现在可以处理一般情况。

于 2010-12-04T02:31:57.303 回答