在python中将字母数字字符串转换为int,反之亦然
我正在尝试将最大长度为40个字符的字母数字字符串转换为尽可能小的整数,以便我们可以轻松地从数据库中保存和检索。我不知道是否有任何python方法,或者我们可以使用的任何简单算法。具体来说,我的字符串将只有字符0-9和a-g。因此,如果您对如何将字符串唯一地转换为int以及如何将int唯一地转换为string有任何建议,请提供帮助。我在Cent os 6.5上使用Python 2.7,这并不难:在python中将字母数字字符串转换为int,反之亦然,python,Python,我正在尝试将最大长度为40个字符的字母数字字符串转换为尽可能小的整数,以便我们可以轻松地从数据库中保存和检索。我不知道是否有任何python方法,或者我们可以使用的任何简单算法。具体来说,我的字符串将只有字符0-9和a-g。因此,如果您对如何将字符串唯一地转换为int以及如何将int唯一地转换为string有任何建议,请提供帮助。我在Cent os 6.5上使用Python 2.7,这并不难: def str2int(s, chars): i = 0 for c in rever
def str2int(s, chars):
i = 0
for c in reversed(s):
i *= len(chars)
i += chars.index(c)
return i
def int2str(i, chars):
s = ""
while i:
s += chars[i % len(chars)]
i //= len(chars)
return s
例如:
>>> chars = "".join(str(n) for n in range(10)) + "abcdefg"
>>> str2int("0235abg02", chars)
14354195089
>>> int2str(_, chars)
'0235abg02'
基本上,如果要将n个字符编码为整数,则将其解释为base-n。输入中有17个符号,因此可以将is视为base-17数字:
>>> int('aga0',17)
53924
对于反向转换,有很多解决方案。改进了上述答案:
# The location of a character in the string matters.
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
charsLen = len(self.chars)
def numberToStr(num):
s = ""
while num:
s = self.chars[num % charsLen] + s
num //= charsLen
return s # Or e.g. "s.zfill(10)"
可以处理前导为0的字符串:
def strToNumber(numStr):
num = 0
for i, c in enumerate(reversed(numStr)):
num += chars.index(c) * (charsLen ** i)
return num
如何将字符转换为整数?作为一个整数,“a0b3”是什么?是否需要进行一些转换,例如,使用字符a-g的ASCII值?是否要从该字符串中选择数字或将整个字符串“序列化”为整数?后者肯定不起作用-对于40字节长的字符串肯定不起作用。。。另外,字符串可能是写入数据库的第二种最常见的数据类型-为什么要费心转换它呢?@TimBiegeleisen不一定,但只要我们可以轻松还原转换,一切都很好,希望这是清楚的,需要唯一映射您可能希望查看
struct.pack
如果需要编码的字符不是[0-9a-g]的直接扩展名,例如[0-9a-gz],并且不提供返回的方法,则会出现这种情况。很好,整数的大小似乎会随着字符串大小而快速增加,那么,你知道我们能得到的最大整数是多少吗?什么时候发生的?当我们拥有最多(可能是全部)字母、数字或其他任何东西时。你真的建议这样的转换而不是保存字符串本身吗?@RAFIQ对长度为n的任意字符串进行编码,字符集大小为c,其最大大小为c^n。这是一个信息论下限,不能加以改进。在我上面的示例中,当您只编码最后一个字符的字符串时,就会发生这种情况,例如“gggg”。我不会建议进行这种转换,除非您确定这样做会显著降低项目的硬件存储成本。s+=chars[I%len(chars)]->s=chars[I%len(chars)]+s