1

テキストコーディングを使用してエンコーダーとデコーダーを構築したいと思います。

入力として文字列「AAABBBBCDDDDDDDDDDEEDDDD」を入力すると、文字列「A3B4C1D10E2D4」が返されます。各アルファベット記号の後に文字列内での頻度が続きます。デコーダーはプロセスを逆にします。

Python を使い始めるのに役立ちます。

4

4 に答える 4

1

この質問を正確にあなたが望むものではないことを確認してください、しかしそれはあなたがそれをしようとするのを助けることができます

暗号文の文字頻度の決定

于 2013-01-26T17:18:55.333 に答える
1

解決策はさまざまな方法でアプローチでき、ループベースの解決策としては非常に簡単であり、演習として残されています

Python のバッテリーの力を味わっていただくために、groupby を使用したソリューションを提案します。

>>> ''.join("{}{}".format(k, sum(1 for e in v))
        for k,v in groupby("AAABBBBCDDDDDDDDDDEEDDDD"))
'A3B4C1D10E2D4'

このソリューションの特徴

  1. itertools.groupbyは、同様の連続データをキーと値のペアとしてグループ化します。ここで、キーは重複要素であり、値は繰り返しのグループです。
  2. グループはジェネレーターであるため、lenはここでは機能しない可能性がありますが、非シーケンス iterable の長さを計算する可能な方法は、sumを使用することです。
  3. str.joinは iterable を結合して、提供されたセパレーターを使用して文字列を生成します。この場合は空の文字列です。
于 2013-01-26T17:46:49.737 に答える
0

まず、Python文字列のドキュメントを調べます。具体的には、そこから検索またはカウントして作業します。文字列内の実際のコンテンツがそのように重要である場合、エンコードしたものを実際にデコードできるかどうかはわかりませんが。

于 2013-01-26T17:14:04.197 に答える
0

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関数で文字列を作成してから返すこともできます。

于 2013-01-26T17:22:02.587 に答える