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

Pythonでバイナリ文字列の連続する1の最大長を求める方法:map関数と正規表現による2つのアプローチ

数値をバイナリ(2進数)表現で扱う際、その中に「1」が何個連続して並んでいるのかを調べたいケースがあります。例えばデータ解析やビット演算の処理では、このような集計が必要になることがあります。本記事では、Pythonで連続する1の最大長を求める2つの方法を、具体的なコード例とともに解説します。

方法1:split関数とmap関数を組み合わせる

Pythonのsplit()関数は、指定した区切り文字をもとに文字列を複数の部分に分割します。この性質を利用して、「0」を区切り文字としてバイナリ文字列を分割すると、残る各部分はすべて連続する「1」のブロックになります。そこでmap()関数で各ブロックの長さを取得し、max()でその最大値を求めれば、連続する1の最大長が得られます。

コード例

data = '11110000111110000011111010101010101011111111'

def Max_len_cons_1(data):
    print("Maximum Number of consecutive one's: ", max(map(len, data.split('0'))))

Max_len_cons_1(data)

実行結果

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

Maximum Number of consecutive one's: 8

方法2:正規表現を使用する

Pythonのreモジュールを使っても、連続する1の最大数をカウントできます。ここでは「1+」というパターン(1個以上の連続する1)をfindall()で検索し、見つかったすべてのブロックの中から最も長いものを特定します。

コード例

data = '11110000111110010011'
import re

the_ones = re.findall(r"1+", data)
print("The blocks of one's: ", the_ones)
print("Maximum Number of consecutive one's =", len(max(the_ones, key=len)))

実行結果

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

The blocks of one's: ['1111', '11111', '1', '11']
Maximum Number of consecutive one's = 5

まとめ

split + map方式はコードがシンプルで、追加のインポートが不要な点が魅力です。一方、正規表現方式は途中経過として「1」のブロック一覧を確認できるため、デバッグや詳細な分析に向いています。用途に応じて使い分けるとよいでしょう。

  1. PythonでDFAを使って2進数文字列が3の倍数かどうかを判定する方法

    はじめに ある数の2進表現を配列 n として受け取り、その値が3で割り切れるかどうかを「決定性有限オートマトン(DFA)」を使って判定する問題を考えてみましょう。 例えば、入力が n = [1, 1, 0, 0](10進数の12に相当)であれば、12は3の倍数なので出力は True になります。 DFAによるアプローチ この問題は、次のようなDFAを構築することで解けます。 考え方はシンプルです。ある数が3で割り切れるとき余りは0になり、割り切れない場合は余りが1または2になります。そこで、これら3つの余り(0・1・2)に対応する3つの状態を用意します。初期状態は余り0を表すため、同時に受理

  2. 連続する「1」を含まないバイナリ文字列の数を数えるPythonプログラム

    この記事では、「連続する1が存在しないバイナリ文字列の総数を求める」という問題の解き方について、Pythonでの実装例を交えながら詳しく解説します。 問題文 問題: 正の整数 N が与えられます。このとき、長さ N のバイナリ文字列(0と1のみで構成される文字列)のうち、連続する「1」が一切含まれないものの総数を求めてください。 例えば N = 3 の場合、有効な文字列は「000」「001」「010」「100」「101」の5つとなり、「011」「110」「111」は連続する1を含むため除外されます。 アプローチ:動的計画法 この問題は動的計画法(DP)を使うことで効率的に解けます。各桁の状態を