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 レシピを試してください。

通常、基数変換はケースを区別しません。これを完全に拡張してその区別をする方法はわかりませんが、レシピから始めましょう。

于 2010-12-04T01:47:21.283 に答える
2

番号を継承できます。番号:

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 に答える