2015-03-13 88 views
1

我試圖將最大長度爲40個字符的字母數字字符串轉換爲儘可能小的整數,以便我們可以輕鬆地保存並從數據庫中檢索。我不知道是否存在任何python方法或任何我們可以使用的簡單算法。具體而言,我的字符串將只有字符0-9和a-g。所以請提供任何建議,以便我們可以將字符串唯一地轉換爲int,反之亦然。我使用Python 2.7美分OS 6.5在python中將字母數字字符串轉換爲int,反之亦然

+0

如何將字符轉換爲int?什麼將「a0b3」作爲一個整數?您是否希望進行一些轉換,例如通過使用ASCII值爲字符a-g? – 2015-03-13 07:15:04

+0

你想從字符串中選擇數字還是將整個字符串「序列化」爲整數?後者肯定不會工作 - 當然不是40字節長的字符串......另外,字符串可能是寫入數據庫的第二常用數據類型 - 爲什麼要轉換它呢? – sebastian 2015-03-13 07:15:15

+0

@TimBiegeleisen不一定,但任何事情都可以,只要我們可以輕鬆地恢復轉換,希望這是明確的,需要獨特的映射 – RAFIQ 2015-03-13 07:18:31

回答

2

這並不難:

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' 

基本上,如果你想ň字符編碼爲您解讀一個整數它作爲base-n

+0

偉大的整數大小似乎迅速增加與字符串大小,所以任何想法可能是最大的整數大小,我們可以得到什麼時候它會發生?當我們擁有大部分(可能是全部)字母或數字或其他任何東西時。你真的建議通過保存字符串本身進行這種轉換嗎? – RAFIQ 2015-03-13 07:35:30

+0

@RAFIQ使用大小爲_c_的字符集對長度爲_n_的任意字符串進行編碼的最大大小爲c^n。這是一個信息論下限,不能改進。當我編碼只包含最後一個字符的字符串時,這發生在我上面的例子中,例如「gggg」。除非您確定這樣做會顯着降低項目的硬件存儲成本,否則我不會建議這種轉換。 – orlp 2015-03-13 07:41:17

1

,我們在您輸入17個標誌,所以你可以把作爲一個基17號:

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

對於反向轉換,有很多超過here解決方案。

+1

如果編碼所需的字符不是[0-9a-g]的直接擴展名,例如[0-9a-gz]並且不提供回頭路,則會中斷。 – orlp 2015-03-13 07:29:42

相關問題