どのようにして、ベース36の整数をPythonでエンコードしてから、もう一度デコードすることができますか?Pythonベース36エンコーディング
答えて
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')
私は以前これを読んでいたと思います。ここに答えがあります:
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'))
小文字アルファベットを含めるには、「整数をPythonの最短URL安全文字列に変換する方法」を参照してください(http://stackoverflow.com/questions/561486/how-to-convert-an-integer-to-the- Python/561704#561704) –
@Tadeck:あなたはそれを返す前に 'base36'を元に戻す必要があるからです。 –
@ジョニー:私の間違いは、それは同じではないでしょう。 – Tadeck
恐ろしい答えですが、私はこれを共有したいと考えていました。
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
私はこれがかなり好きですが、おそらくもっと短いコードでは弱点があります。 –
math.logは精度の低い浮動小数点数を返します。小数部を切り捨てる前に14桁に丸めます。これにより、例えば、5.999999999999999を5.0にすることを避けることができます。 –
a == 0でmath.log()が失敗し、とにかくそれを使うと失敗します。 –
これは、正の整数だけを気にする場合に有効です。
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
from numpy import base_repr
num = base_repr(num, 36)
num = int(num, 36)
を参照してくださいnumpyについての情報があります。
私はこのデータをサンプルデータで実行可能にし、さらに多くのドキュメントリソースを追加することで、この回答を改善しようとしました。編集は何らかの理由で拒否され、それはそれ自身の答えとしてより適切であるという説明とともに拒否されました。したがって、私はあなたの答えの私の改善版を追加しました:http://stackoverflow.com/questions/1181919/python-base-36-encoding/42331616#42331616 –
https://github.com/tonyseek/python-base36を使用できます。
$ pip install base36
、その後
>>> import base36
>>> assert base36.dumps(19930503) == 'bv6h3'
>>> assert base36.loads('bv6h3') == 19930503
これは正しい答えです。なぜ誰もが車輪を再構築したいと思うのか分かりません。 –
@MichaelScheper依存関係は難しいので、 'leftpad'を参照してください。単純な関数をコピーして、必要なファイルに貼り付けることは、時には新しい外部依存関係を追加するよりも優れています。 – mbarkhau
@mbarkhauリポジトリベンダーやプライベートPyPIミラー(Golangプロジェクトと同じように)に3番目の依存関係をダウンロードできます。それは、単なるコピー・ペーストのコード・スニペット、分離されたテスト・カバレッジおよびリリース・プランのためのほうがよいかもしれません。 –
あなたはこのために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
numpy、int(x, base=10)
、およびnp.base_repr(number, base=2, padding=0)
に関するいくつかの情報があります。
(この答えはもともと@クリストファー・belandの答えに編集として提出されたが、その自身の答えの賛成で否決された。)
- 1. 足ベースOauthエンコーディング
- 2. ベース64エンコーディングのクラッシュ
- 3. Python文字エンコーディング?
- 4. Python文字エンコーディング
- 5. Pythonエンコーディング変換
- 6. ベース64エンコーディングに変換する利点?
- 7. Python HTMLエンコーディング\ xc2 \ xa0
- 8. Python POSTリクエストのエンコーディング
- 9. python qpidメッセージのエンコーディング
- 10. Python ISO-8859-1エンコーディング
- 11. PythonベースのPowerShell?
- 12. ColdFusion Illudium PU-36コードジェネレータ
- 13. Python UTF16LEファイルからUTF8エンコーディング
- 14. Pythonの要求エンコーディングPOSTデータ
- 15. Strange GAE Pythonエンコーディングの問題
- 16. のPython 2.7エンコーディングとfeedparser
- 17. urllib.quoteでPythonエンコーディング文字
- 18. python 3.0 open()デフォルトのエンコーディング
- 19. python zipfileの円弧のエンコーディング
- 20. Pythonのデコード/エンコーディングの問題
- 21. C++ベースのスレッドモデルのPython 'print'
- 22. Enthought TraitsUIベースのPython IDE
- 23. ベース36 IDの冒涜を除外するにはどうすればいいですか?
- 24. Python:エンコーディングについての質問
- 25. Pythonリクエストの不明なエンコーディング:idna
- 26. Python IRCボットとエンコーディングの問題
- 27. mysqldbでのPythonエンコーディングの問題
- 28. Python 2.7:LookupError:不明なエンコーディング:cp65001
- 29. タイプchar(36)のコードの最初のカラム
- 30. Python 3でsys.stdoutエンコーディングを設定するには? Pythonの2のデフォルトの出力エンコーディングを設定
最短のURLセーフな文字列に整数を変換する[方法の可能性の重複Pythonで?](http://stackoverflow.com/questions/561486/how-to-convert-an-integer-to-the-shortest-url-safe-string-in-python) – Belldandu