在Python中将字母数字字符串转换为整数及其反向操作

5

我正试图将最大长度为40个字符的字母数字字符串转换为尽可能小的整数,以便我们可以轻松地保存和检索数据库。 我不知道是否有任何现有的Python方法或任何简单的算法可供使用。 具体来说,我的字符串仅包含字符0-9和a-g。 因此,请提供任何建议,以便我们如何将字符串唯一地转换为整数,反之亦然。 我正在Centos 6.5上使用Python 2.7


你怎样将字符转换为整数?"a0b3" 作为整数是多少?你需要进行一些转换吗,例如使用字符 a-g 的 ASCII 值? - Tim Biegeleisen
你想从那个字符串中提取数字还是将整个字符串序列化为整数?后者肯定行不通 - 尤其是对于40字节长的字符串...此外,字符串可能是写入数据库的第二常见数据类型 - 为什么要费心转换它呢? - sebastian
@TimBiegeleisen 不一定,但只要我们可以轻松地恢复转换,任何东西都可以,希望这很清楚,需要唯一映射。 - RAFIQ
你可能希望查看struct.pack - cdarke
3个回答

7

这并不难:

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 个字符编码为整数,你需要将其解释为 n 进制。

很好,整数的大小似乎随着字符串大小而迅速增加,那么我们能得到的最大整数大小是多少?什么时候会发生?当我们拥有大部分(甚至全部)字母、数字或其他任何东西时。您真的建议这种转换比保存字符串本身更好吗? - RAFIQ
@RAFIQ,使用字符集大小为_c_的任意长度_n_字符串编码将具有最大尺寸c^n。这是一个信息理论下限,无法改进。当您仅对最后一个字符的字符串进行编码时,例如“gggg”,就会发生这种情况。除非您已确定这样做可以显著降低项目的硬件存储成本,否则我不建议进行此转换。 - orlp
s += chars[i % len(chars)] 翻译为:s = chars[i % len(chars)] + s - nvd

5

您输入的内容有17个符号,因此可以将其视为一个基数为17的数字:

>>> int('aga0',17)
53924

对于反向转换,这里有很多解决方案:这里


3
如果需要编码的字符不是[0-9a-g]的直接扩展,例如[0-9a-gz],则此方法会失效,并且无法提供回退方式。 - orlp

2

对以上回答进行改进:

最初的回答

# The location of a character in the string matters.
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"

charsLen = len(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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接