2009-07-25 12 views
25

どのようにして、ベース36の整数をPythonでエンコードしてから、もう一度デコードすることができますか?Pythonベース36エンコーディング

+0

最短のURLセーフな文字列に整数を変換する[方法の可能性の重複Pythonで?](http://stackoverflow.com/questions/561486/how-to-convert-an-integer-to-the-shortest-url-safe-string-in-python) – Belldandu

答えて

32

Wikipediaのサンプルコードを試しましたか?

def base36encode(number, alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZ'): 
    """Converts an integer to a base36 string.""" 
    if not isinstance(number, (int, long)): 
     raise TypeError('number must be an integer') 

    base36 = '' 
    sign = '' 

    if number < 0: 
     sign = '-' 
     number = -number 

    if 0 <= number < len(alphabet): 
     return sign + alphabet[number] 

    while number != 0: 
     number, i = divmod(number, len(alphabet)) 
     base36 = alphabet[i] + base36 

    return sign + base36 

def base36decode(number): 
    return int(number, 36) 

print base36encode(1412823931503067241) 
print base36decode('AQF8AA0006EH') 
+18

もし彼らがstrをすることができるならキリスト - > intを任意の基底に置くと、組み込み関数を持つ任意の基底でint-> strを実行させると思うでしょう。 – Dubslow

+4

'' string'のインポートを追加し、アルファベットの値を ' string.digits + string.lowercase' – DataGreed

+1

'base36encode'と' base36decode'との間のインターフェースが壊れています。後者は何もコード化されていないw ithカスタム 'アルファベット'引数 – Grozz

31

私は以前これを読んでいたと思います。ここに答えがあります:

def base36encode(number): 
    if not isinstance(number, (int, long)): 
     raise TypeError('number must be an integer') 
    if number < 0: 
     raise ValueError('number must be positive') 

    alphabet, base36 = ['ABCDEFGHIJKLMNOPQRSTUVWXYZ', ''] 

    while number: 
     number, i = divmod(number, 36) 
     base36 = alphabet[i] + base36 

    return base36 or alphabet[0] 


def base36decode(number): 
    return int(number, 36) 

print(base36encode(1412823931503067241)) 
print(base36decode('AQF8AA0006EH')) 
+4

小文字アルファベットを含めるには、「整数をPythonの最短URL安全文字列に変換する方法」を参照してください(http://stackoverflow.com/questions/561486/how-to-convert-an-integer-to-the- Python/561704#561704) –

+0

@Tadeck:あなたはそれを返す前に 'base36'を元に戻す必要があるからです。 –

+0

@ジョニー:私の間違いは、それは同じではないでしょう。 – Tadeck

9

恐ろしい答えですが、私はこれを共有したいと考えていました。

import string, math 

int2base = lambda a, b: ''.join(
    [(string.digits + string.lowercase + string.uppercase)[(a/b**i)%b] 
    for i in xrange(int(math.log(a, b)), -1, -1)] 
    ) 

num = 1412823931503067241 
test = int2base(num, 36) 
test2 = int(test, 36) 
print test2 == num 
+0

私はこれがかなり好きですが、おそらくもっと短いコードでは弱点があります。 –

+4

math.logは精度の低い浮動小数点数を返します。小数部を切り捨てる前に14桁に丸めます。これにより、例えば、5.999999999999999を5.0にすることを避けることができます。 –

+1

a == 0でmath.log()が失敗し、とにかくそれを使うと失敗します。 –

2

これは、正の整数だけを気にする場合に有効です。

def int_to_base36(num): 
    """Converts a positive integer into a base36 string.""" 
    assert num >= 0 
    digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 

    res = '' 
    while not res or num > 0: 
     num, i = divmod(num, 36) 
     res = digits[i] + res 
    return res 

intに変換するには、int(num, 36)を使用してください。任意の塩基転換のためにここでhttps://gist.github.com/mbarkhau/1b918cb3b4a2bdaf841c

11
from numpy import base_repr 

num = base_repr(num, 36) 
num = int(num, 36) 

を参照してくださいnumpyについての情報があります。

+0

私はこのデータをサンプルデータで実行可能にし、さらに多くのドキュメントリソースを追加することで、この回答を改善しようとしました。編集は何らかの理由で拒否され、それはそれ自身の答えとしてより適切であるという説明とともに拒否されました。したがって、私はあなたの答えの私の改善版を追加しました:http://stackoverflow.com/questions/1181919/python-base-36-encoding/42331616#42331616 –

5

https://github.com/tonyseek/python-base36を使用できます。

$ pip install base36 

、その後

>>> import base36 
>>> assert base36.dumps(19930503) == 'bv6h3' 
>>> assert base36.loads('bv6h3') == 19930503 
+1

これは正しい答えです。なぜ誰もが車輪を再構築したいと思うのか分かりません。 –

+0

@MichaelScheper依存関係は難しいので、 'leftpad'を参照してください。単純な関数をコピーして、必要なファイルに貼り付けることは、時には新しい外部依存関係を追加するよりも優れています。 – mbarkhau

+1

@mbarkhauリポジトリベンダーやプライベートPyPIミラー(Golangプロジェクトと同じように)に3番目の依存関係をダウンロードできます。それは、単なるコピー・ペーストのコード・スニペット、分離されたテスト・カバレッジおよびリリース・プランのためのほうがよいかもしれません。 –

4

あなたはこのためにnumpyののbase_repr(...)を使用することができます。ここで

import numpy as np 

num = 2017 

num = np.base_repr(num, 36) 
print(num) # 1K1 

num = int(num, 36) 
print(num) # 2017 

numpyint(x, base=10)、およびnp.base_repr(number, base=2, padding=0)に関するいくつかの情報があります。

(この答えはもともと@クリストファー・belandの答えに編集として提出されたが、その自身の答えの賛成で否決された。)

関連する問題