Pythonでリストから連続する類似要素の範囲を抽出する方法
リストの中から連続して現れる同じ要素の範囲(開始位置と終了位置)を抽出したい場合、シンプルな反復処理とappendメソッドを組み合わせることで実現できます。本記事では、その具体的な実装方法を解説します。
サンプルコード
以下は、連続する類似要素の範囲を抽出するPythonコードの例です。
my_list = [12, 23, 23, 23, 48, 48, 36, 17, 17]
print("The list is : ")
print(my_list)
my_result = []
index = 0
while index < (len(my_list)):
start_position = index
val = my_list[index]
while (index < len(my_list) and my_list[index] == val):
index += 1
end_position = index - 1
my_result.append((val, start_position, end_position))
print("The my_result is :")
print(my_result)出力結果
The list is : [12, 23, 23, 23, 48, 48, 36, 17, 17] The my_result is : [(12, 0, 0), (23, 1, 3), (48, 4, 5), (36, 6, 6), (17, 7, 8)]
処理の流れと解説
まず、対象となるリストを定義し、コンソールに表示します。
結果を格納するための空のリスト
my_resultを作成します。インデックス変数
indexを0で初期化します。外側の
whileループでリスト全体を走査します。各ループの開始時に、現在のインデックスを開始位置として記録し、その位置の値を基準値
valとして取得します。内側の
whileループでは、「インデックスがリストの長さ未満であること」かつ「現在の要素が基準値と一致していること」という条件をチェックします。条件が満たされている間はインデックスを1ずつ増加させ、連続する同じ値のブロックの終わりまで進みます。
ブロックが終了した時点で、終了位置を「現在のインデックス − 1」として求めます。
(値, 開始インデックス, 終了インデックス) の形式のタプルを結果リストに追加します。
すべての要素を処理し終えた後、結果をコンソールに出力します。
補足:itertools.groupbyを使った別のアプローチ
標準ライブラリのitertools.groupbyを利用すると、より簡潔に同様の処理を実装することも可能です。
from itertools import groupby
my_list = [12, 23, 23, 23, 48, 48, 36, 17, 17]
my_result = []
pos = 0
for key, group in groupby(my_list):
length = len(list(group))
my_result.append((key, pos, pos + length - 1))
pos += length
print(my_result)
# [(12, 0, 0), (23, 1, 3), (48, 4, 5), (36, 6, 6), (17, 7, 8)]どちらの方法でも、連続する同一要素ごとに「値・開始位置・終了位置」をまとめたデータを取得できるため、データの圧縮やランレングス処理などにも応用できます。
-
Pythonのリストで連続する要素をペアにする方法
Pythonでデータ分析を行っていると、リスト内の隣接する(連続する)要素同士をペアとして取り出したい場面に出会うことがあります。本記事では、この処理を実現するための代表的な2つの方法を、サンプルコードとともにわかりやすく解説します。インデックスとrangeを組み合わせる方法まずは、リストの連続するインデックスを組み合わせてペアを作る式を設計する方法です。range関数に「リストの長さ − 1」を渡すことで、ペアリングを繰り返す最大回数を決定します。これにより、最後の要素にアクセスする際に範囲外エラーが発生するのを防いでいます。サンプルコードlistA = [51,23,11,45] # 対象
-
Pythonでリストに数値の範囲(シーケンス)を追加する方法
リストはPythonで最も頻繁に使用されるデータコンテナの一つです。リストを扱っていると、連続した数値のシーケンスを要素として追加したい場面によく出会います。Pythonには、このような数値のシーケンスをリストに追加するための方法がいくつか用意されています。本記事では、代表的な手法をわかりやすく紹介します。 range()とextend()を使う方法 extend()メソッドを使うと、リストの末尾に複数の要素を一度に追加できます。range()関数で生成した数値のシーケンスをextend()に渡すことで、必要な連番をすべてリストの末尾にまとめて追加できます。 コード例 listA = [55,