テキストコーディングを使用してエンコーダーとデコーダーを構築したいと思います。
入力として文字列「AAABBBBCDDDDDDDDDDEEDDDD」を入力すると、文字列「A3B4C1D10E2D4」が返されます。各アルファベット記号の後に文字列内での頻度が続きます。デコーダーはプロセスを逆にします。
Python を使い始めるのに役立ちます。
この質問を正確にあなたが望むものではないことを確認してください、しかしそれはあなたがそれをしようとするのを助けることができます
解決策はさまざまな方法でアプローチでき、ループベースの解決策としては非常に簡単であり、演習として残されています
Python のバッテリーの力を味わっていただくために、groupby を使用したソリューションを提案します。
>>> ''.join("{}{}".format(k, sum(1 for e in v))
for k,v in groupby("AAABBBBCDDDDDDDDDDEEDDDD"))
'A3B4C1D10E2D4'
このソリューションの特徴
まず、Python文字列のドキュメントを調べます。具体的には、そこから検索またはカウントして作業します。文字列内の実際のコンテンツがそのように重要である場合、エンコードしたものを実際にデコードできるかどうかはわかりませんが。
cnoder の考えられる解決策の 1 つは、単純に文字列を反復処理して文字の出現回数を数えることです。
def encode(s):
last = s[0]
count = 0
for c in s:
if last != c:
yield '%s%i' % (last, count)
last = c
count = 0
count += 1
yield '%s%i' % (last, count)
デコーダーには、文字列を適切に分割する正規表現を使用できます。独自のパーサーを作成する必要はありません。
import re
def decode(s):
for c, n in re.findall(r'(\w)(\d+)', s):
yield c * int(n)
あなたのテスト入力が与えられた
s = 'AAABBBBCDDDDDDDDDDEEDDDD'
encoded = ''.join(encode(s))
print encoded
decoded = ''.join(decode(encoded))
print decoded
結果は
A3B4C1D10E2D4
AAABBBBCDDDDDDDDDDEEDDDD
もう1つ注意してください。ここでyieldを使用する本当の理由はありません。もちろん、最初にen-/decode関数で文字列を作成してから返すこともできます。