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

Pythonで連続するブール値の範囲を検出する方法

値のリストが与えられたとき、ブール値が「連続したブロック」としてどこに存在するか、その開始位置を知りたいケースがあります。つまり、True を検出した後は False が現れるまで同じ値が続き、逆に False を検出した後は True が現れるまで False が連続するという状態です。

本記事では、このような連続区間の境界位置を求めるための2つのアプローチを、具体的なコード例とともに解説します。

方法1:itertoolsを使う

itertools モジュールの groupbyaccumulate を組み合わせることで、連続する値のまとまりごとの位置を効率的に計算できます。groupby で隣接する同一の値をグループ化し、各グループの要素数を sum で数え、それを accumulate で累積加算することで、各区間の終了位置を順番に求めていきます。リストの先頭に 0 を加えることで、最初の区間の開始位置も含めた結果になります。

コード例

from itertools import accumulate, groupby

# 対象のリスト
listA = [False, True, True, False, False]

print("Given list : \n", listA)

# accumulateを適用
res = [0] + list(accumulate(sum(1 for x in y)
for x, y in groupby(listA)))

# 結果を出力
print("Positions for Range of contigous values:\n ", res)

実行結果

Given list :
[False, True, True, False, False]
Positions for Range of contigous values:
[0, 1, 3, 5]

出力された [0, 1, 3, 5] は、「0番目からFalseの区間」「1番目からTrueの区間」「3番目からFalseの区間」が存在し、5番目でリストが終了することを示しています。

方法2:enumerateを使う

もうひとつの方法として、enumerate 関数と zip 関数を組み合わせる手法があります。これは、各要素とその直前の要素をペアにして比較し、値が切り替わるタイミング(隣接要素が一致しない箇所)を新しい区間の開始位置として検出します。リストの前後に番兵(ここでは 2)を挟むことで、先頭と末尾の境界も正しく処理できるのがポイントです。

コード例

# 対象のリスト
listA = [False, True, True, False, False]

print("Given list : \n", listA)

# enumerateを適用
res = [e for e, (x, y) in
enumerate(zip([2] + listA, listA + [2])) if x != y]

# 結果を出力
print("Positions for Range of contigous values:\n ", res)

実行結果

Given list :
[False, True, True, False, False]
Positions for Range of contigous values:
[0, 1, 3, 5]

まとめ

どちらの方法も同じ結果 [0, 1, 3, 5] を返します。itertools を使う方法は意図が明確で読みやすく、enumeratezip を使う方法は簡潔なリスト内包表記で書けるのが特徴です。データの連続区間を扱う処理(ランレングス圧縮やログ解析など)に応用できるテクニックなので、ぜひ覚えておきましょう。

  1. Pythonのブール演算入門|and・or・notの基本と動作を解説

    Pythonにおけるブール演算の基本 Pythonには、条件分岐や繰り返し処理で欠かせない基本的なブール(論理)演算として、and、or、not の3種類が用意されています。これらの演算子は真偽値(True / False)だけでなく、任意の値やオブジェクトに対して使用できるのが特徴です。 and 演算子 x and y の形式で記述します。x が偽(false)と評価される場合は x をそのまま返し、そうでなければ y を返します。つまり、左側の値が真である場合にのみ、右側の値が結果となります。 or 演算子 x or y の形式で記述します。x が偽と評価される場合は y を返し、そう

  2. Pythonのブール演算子とは?and・or・notの基本と使い方をわかりやすく解説

    Pythonにおけるブール演算子の基本Pythonでは、and、or、not の3つの論理演算子が提供されており、これらは「ブール演算子」とも呼ばれます。条件分岐や繰り返し処理など、プログラムの制御フローを組み立てる際に欠かせない重要な演算子です。それぞれの演算子には以下のような特徴があります。and:2つのオペランド(被演算子)を必要とし、両方が真(True)の場合にのみ True を返すor:2つのオペランドを必要とし、どちらか一方でも真であれば True を返すnot:1つのオペランドを必要とし、その真偽値を反転させるand演算子:両方が真のときだけTrueを返すブール演算子 and は