Python允许从给定base的字符串中轻松创建整数
int(str, base).
Run Code Online (Sandbox Code Playgroud)
我想执行逆向:从整数创建一个字符串,即我想要一些函数int2base(num, base),这样:
int(int2base(x, b), b) == x
Run Code Online (Sandbox Code Playgroud)
函数名称/参数顺序并不重要.
对于任何数量x和底座b是int()会接受的.
这是一个很容易编写的函数:实际上它比在这个问题中描述它更容易.但是,我觉得我必须遗漏一些东西.
我知道的功能bin,oct,hex,但我不能使用他们的几个原因:
这些函数在旧版本的Python上不可用,我需要与它兼容(2.2)
我想要一个通用的解决方案,可以用不同的基础调用相同的方法
我想允许2,8,16以外的碱基
我想要一种在URL中表示整数的最短方式.例如,11234可以使用十六进制缩短为"2be2".由于base64使用的是64字符编码,因此应该可以使用比十六进制更少的字符来表示base64中的整数.问题是我无法弄清楚使用Python将整数转换为base64(以及再返回)的最简洁方法.
base64模块有处理字节串的方法 - 所以也许一个解决方案是将一个整数转换为二进制表示形式作为Python字符串...但我不知道如何做到这一点.
以下代码定义了映射到数字的名称序列.它旨在获取一个数字并检索特定名称.该类通过确保名称存在于其缓存中来运行,然后通过索引将其返回到其缓存中来返回名称.问题在于:如何在不存储缓存的情况下根据数量计算名称?
该名称可以被认为是基数63,除了始终在基数53的第一个数字.
class NumberToName:
def __generate_name():
def generate_tail(length):
if length > 0:
for char in NumberToName.CHARS:
for extension in generate_tail(length - 1):
yield char + extension
else:
yield ''
for length in itertools.count():
for char in NumberToName.FIRST:
for extension in generate_tail(length):
yield char + extension
FIRST = ''.join(sorted(string.ascii_letters + '_'))
CHARS = ''.join(sorted(string.digits + FIRST))
CACHE = []
NAMES = __generate_name()
@classmethod
def convert(cls, number):
for _ in range(number - len(cls.CACHE) + 1):
cls.CACHE.append(next(cls.NAMES))
return cls.CACHE[number]
def __init__(self, *args, …Run Code Online (Sandbox Code Playgroud) 尝试从Python中的UTF-8编码字符串对象获取双精度浮点分数.想法是抓住字符串的前8个字节并创建一个float,这样按照得分排序的字符串将根据它们的前8个字节(或者可能是它们的前63位,在强制它们全部被强制执行后)按字典顺序排序.积极的,以避免签署错误).
例如:
get_score(u'aaaaaaa') < get_score(u'aaaaaaab') < get_score(u'zzzzzzzz')
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用bit-shift-left和XOR计算整数得分,但我不确定如何将其转换为float值.我也不确定是否有更好的方法来做到这一点.
如何计算字符串的分数,以满足我之前指定的条件?
编辑:字符串对象是UTF-8编码的(根据@ Bakuriu的提交).
使用像"1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ"这样的字母表我想生成2到4个字母代码来识别唯一的数据存储条目.我有能力的时候传递了一个列表显示最后一个码[7,17,11]的字母位置这样做的蟒蛇功能 - >"7GA".下一个代码可以通过将最右边的元素递增一个并且在超过字母长度时携带一个元素来生成.
这种方法的优点是可以保持代码简短,顺序,一致,易于通信,以及查看我希望它们的方式.
我想知道这是否适用于app引擎,因为该函数必须保留或传递最后一个标识符以强制执行唯一性,这可能不适合Google基础结构的非连续性.允许这种情况发生的替代方法或推理反对它的理由.
我注意到短 URL 站点使用字母数字 id 而不是整数作为 unqiue id。
有没有人有实施的经验?在 MySQL 中实现此功能的最佳方法是什么?我相信棘手的部分可能是 id 的增量和索引。
例子: bit.ly/AbC123
我正在尝试使用以下方法为我的一个模型创建一个缩短的ID:
_char_map = string.ascii_letters+string.digits
def index_to_char(sequence):
return "".join([_char_map[x] for x in sequence])
def make_short_id(self):
_id = self.id
digits = []
while _id > 0:
rem = _id % 62
digits.append(rem)
_id /= 62
digits.reverse()
return index_to_char(digits)
@staticmethod
def decode_id(string):
i = 0
for c in string:
i = i * 64 + _char_map.index(c)
return i
Run Code Online (Sandbox Code Playgroud)
self.iduuid即在哪里1c7a2bc6-ca2d-47ab-9808-1820241cf4d4,但出现以下错误:
rem = _id%62 TypeError:在字符串格式化期间并非所有参数都已转换
仅当id是时,此方法才有效int。
如何修改缩短uuuid和解码的方法?
更新:
感谢您的帮助。我试图找到一种创建编码和解码方法的方法,该方法采用一个字符串,使其变短,然后再次将其解码。上面指出的方法永远无法使用字符串(uuid),
给定一个随机整数,例如19357982357627685397198。如何将这些数字压缩为字符数较少的文本字符串?
文本字符串只能包含数字或字母字符(大写和小写)。
我尝试过声称可以压缩的 Base64 和 Huffman 编码,但在键盘上书写时,它们都没有使字符串更短。
我还尝试制作某种算法,尝试将整数除以数字“2,3,...,10”,并检查结果中的最后一个数字是否是它被除以的数字(在中查找 0)除以 10 的情况)。因此,解密时,只需将数字乘以整数中的最后一个数字即可。但这不起作用,因为在某些情况下,你不能除以任何东西,并且数字将保持不变,并且当它被解密时,它只会将其乘以比你开始时更大的数字。
我还尝试将整数分成从左开始的 2 个数字块,并给它们一个字母(a =1,b =2,o =15),当它到达z时,它只会回滚到a。这不起作用,因为当它被解密时,它不知道数字滚动了z多少次,因此比开始时的数字要小得多。
我还尝试了一些其他常见的加密策略。例如 Base32、Ascii85、Bifid Cipher、Baudot Code 以及其他一些我不记得了。
这似乎是一个无法解决的问题。但由于它以整数开头,因此每个数字可以包含 10 种不同的组合。在字母表中,字母可以包含 26 种不同的组合。这使得您可以用 5 个字母存储比用 5 位整数存储的数据更多的数据。因此,用数学方法可以在字符串中存储比整数更多的数据,但我只是找不到任何人曾经这样做过。
python ×7
base ×1
base64 ×1
compression ×1
converter ×1
django ×1
double ×1
encryption ×1
integer ×1
mysql ×1
namespaces ×1
python-2.7 ×1
radix ×1
sorting ×1
sql ×1
string ×1
unicode ×1
url ×1