Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでランレングスエンコーディングを実装する方法

このチュートリアルでは、Pythonを使ってランレングスエンコーディング(Run-Length Encoding)を作成する方法を解説します。与えられた文字列に対して、「文字+出現回数」という形式の新しい文字列を生成して返すプログラムです。

例えば、文字列 tutorialspointt3u1o2r1i2a1l1s1p1n1 とエンコードされます。これは各文字とその出現回数を順に連結したもので、元の文字列に最初に出現した順序が保たれます。

実装の手順

  • run_length_encoding という名前の関数を定義します。

  • collections.OrderedDict を使い、各文字のカウントを 0 で初期化した辞書を作成します。

  • 文字列の各文字を走査しながら、辞書内の出現回数をインクリメントしていきます。

  • すべての文字と出現回数を連結し、結果を出力します。

  • 対象となる文字列を初期化し、関数を呼び出します。

サンプルコード

それでは、上記の手順に沿って実際のコードを見てみましょう。

# collectionsモジュールをインポート
import collections

# 関数の定義
def run_length_encoding(string):
    # カウント用の辞書を初期化
    count_dict = collections.OrderedDict.fromkeys(string, 0)
    # 文字列を走査
    for char in string:
        # 出現回数をインクリメント
        count_dict[char] += 1
    # エンコード結果を格納する空文字列
    encoded_string = ""
    # 文字と出現回数を連結
    for key, value in count_dict.items():
        encoded_string += key + str(value)
    # エンコード結果を出力
    print(encoded_string)

# 文字列の初期化
string = "tutorialspoint"
# 関数の呼び出し
run_length_encoding(string)

# 別の文字列
string = "aaaaaabbbbbccccccczzzzzz"
run_length_encoding(string)

実行結果

上記のコードを実行すると、次のような出力が得られます。

t3u1o2r1i2a1l1s1p1n1
a6b5c7z6

応用:itertools.groupby による連続文字の圧縮

なお、一般的なランレングスエンコーディングは「連続して現れる同じ文字」を圧縮する手法です。その場合は、標準ライブラリの itertools.groupby を使うことで、より簡潔に実装できます。

from itertools import groupby

def rle(string):
    return "".join(char + str(len(list(group))) for char, group in groupby(string))

print(rle("aaabbbcccd"))  # 出力: a3b3c3d1

用途に応じて、全体の出現回数を数える方法と、連続する文字列を圧縮する方法を使い分けるとよいでしょう。

まとめ

このチュートリアルでは、collections.OrderedDict を活用して、文字列内の各文字とその出現回数を組み合わせたエンコード文字列を生成する方法を学びました。また、itertools.groupby を使った連続文字の圧縮方法も紹介しました。チュートリアルの内容について不明な点がある場合は、コメント欄でお気軽にお知らせください。

  1. 文字列の中から偶数の長さの単語を出力するPythonプログラム

    本記事では、与えられた問題を解決するための考え方と実装方法について解説します。Pythonの基本的な文字列操作を組み合わせることで、初心者の方でも簡単に実装できる内容となっています。 問題文 文字列が与えられたとき、その中に含まれる単語のうち、文字数が偶数であるものをすべて画面に表示するプログラムを作成します。 例えば、「tutorial point」という文字列が入力された場合、「tutorial」は8文字(偶数)なので出力され、「point」は5文字(奇数)なので出力されません。 解決のアプローチ この問題は、以下の手順で解決できます。 split()関数を使って、入力文字列を空白区切り

  2. 【初心者向け】Pythonで文字列の長さを取得する方法をわかりやすく解説

    Pythonで文字列の長さを取得する基本:len()関数Pythonには、文字列やリスト、タプルといった複合オブジェクトの長さ(要素数)を取得できる組み込み関数 len() が用意されています。文字列の長さを知りたい場合は、対象の文字列をそのまま len() の引数として渡すだけでOKです。print(len(abcdefghijklmnopqrstuvwxyz))出力結果:26変数に格納した文字列の長さを取得する実際の開発では、変数に代入した文字列の長さを調べる場面が多いでしょう。次のように、変数を len() に渡すだけで簡単に取得できます。text = Hello, Python! pr