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
No sé cómo se llama esto. Base algo?
Todo lo que quiero es una función que pueda convertir los números en estos, y estos de nuevo a números.
¿Hay una función fácil que puede hacer esto?
Puede heredar números.
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
Encontré otro error. Cambie a una función de fábrica. Ahora puede manejar la situación general.
>>> int("a", 36) 10 >>> int("z", 36) 35 >>> int("10", 36) 36
La otra dirección es más complicada, pero pruebe esta receta de ActiveState .
Normalmente las conversiones de base no hacen distinción entre casos. No estoy seguro de cómo extender esto completamente para hacer esa distinción, pero la receta debería darle un comienzo.