Pythonでリスト内の値KがN個以上連続する範囲を検出する方法
Pythonでは、リスト内で特定の値「K」が「N」個以上連続して現れる範囲(開始インデックスと終了インデックス)を取得したい場合があります。このような処理には、enumerate関数とシンプルな反復処理を組み合わせる方法が有効です。
コード例
以下に具体的な実装例を示します。
my_list = [3, 65, 33, 23, 65, 65, 65, 65, 65, 65, 65, 3, 65]
print("The list is :")
print(my_list)
K = 65
N = 3
print("The value of K is ")
print(K)
print("The value of N is ")
print(N)
my_result = []
beg, end = 0, 0
previous = 1
for index, element in enumerate(my_list):
if element == K:
end = index
if previous != K:
beg = index
else:
if previous == K and end - beg + 1 >= N:
my_result.append((beg, end))
previous = element
print("The result is :")
print(my_result)
出力結果
The list is : [3, 65, 33, 23, 65, 65, 65, 65, 65, 65, 65, 3, 65] The value of K is 65 The value of N is 3 The result is : [(4, 10)]
処理の解説
まず対象となるリストを定義し、コンソールに表示します。
検索対象の値「K」と、必要な連続回数「N」をそれぞれ定義して表示します。
結果を格納するための空のリスト
my_resultを用意します。連続範囲の開始位置
begと終了位置endを初期化し、直前の要素を記録する変数previousも設定します。enumerate関数を使用してリストを反復処理し、各要素とそのインデックスを同時に取得します。現在の要素が「K」と一致した場合、
endにそのインデックスを代入します。さらに、直前の要素が「K」でなかった場合は、連続区間の始まりとしてbegにも同じインデックスを代入します。現在の要素が「K」と一致しない場合、直前まで「K」が連続しており、かつその長さ(
end - beg + 1)が「N」以上であれば、開始位置と終了位置のタプル(beg, end)を結果リストに追加します。各ループの最後で
previousを現在の要素に更新し、次の比較に備えます。すべての走査が完了すると、条件を満たす連続範囲の一覧が出力として返されます。
この例では、インデックス4から10にかけて値65が7回連続しているため、結果は[(4, 10)]となります。この手法を使えば、任意のリストから指定回数以上連続する要素の範囲を効率的に抽出できます。
-
Pythonでターゲット文字より大きい最小の文字を二分探索で見つける方法
ソート済みの小文字アルファベットのリスト letters と、ターゲットとなる文字 t が与えられたとき、リストの中から「t よりも大きい文字のうち最小のもの」を探す問題を考えてみましょう。このとき、文字は循環(ラップアラウンド)するとします。つまり、target = z で letters = [a, b] のような場合、z より大きい文字が存在しないため、先頭に戻って答えは a になります。例えば、入力が [c, f, j] で target が a の場合、a より大きい最小の文字は c なので、出力は c となります。解き方のアプローチ:二分探索リストがソート済みであるため、二分探索(
-
Pythonで整数配列の最長連続シーケンスの長さを求める方法
整数の配列が与えられたとき、その中に含まれる最も長い連続した数値のシーケンスの長さを求める問題を考えてみましょう。たとえば、入力が [100, 4, 250, 1, 3, 2] の場合、最長の連続シーケンスは [1, 2, 3, 4] となるため、答えは 4 になります。 解法のアプローチ この問題を線形時間 O(n) で解くために、以下の手順に従います。 まず配列をセット(集合)に変換し、変数 longest を 0 で初期化します。 セット内の各要素 i について、「i - 1 がセットに存在しない場合」のみ処理を開始します。これは i が連続シーケンスの始点であることを意味します。