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 = 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
これが何と呼ばれているのかわかりません。ベース何か?
私が欲しいのは、数値をこれらに変換し、これらを数値に戻すことができる関数だけです。
これを行う簡単な機能はありますか?
>>> int("a", 36)
10
>>> int("z", 36)
35
>>> int("10", 36)
36
他の方向はより複雑ですが、この ActiveState レシピを試してください。
通常、基数変換はケースを区別しません。これを完全に拡張してその区別をする方法はわかりませんが、レシピから始めましょう。
番号を継承できます。番号:
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
別のバグを発見。ファクトリ関数に変更します。これで、一般的な状況を処理できます。