Pythonでリストの交互範囲スライスを行う方法|range()・enumerate()の活用
スライシングは、Pythonでリストのデータを分析する際に非常によく使われる基本的な手法です。しかし、分析の目的によっては、特定の範囲の値に基づいてリストを部分的に切り出す必要があります。たとえば、「4つの要素をスキップし、その次の4つの要素を取り出す」という処理を繰り返したい場合などが挙げられます。本記事では、Pythonでこのような交互範囲スライス(alternate range slicing)を実現する方法を、2つのアプローチで解説します。
方法1:range()とlen()を組み合わせる
まず、forループでリスト全体の長さ分だけインデックスを走査し、割り算の判定条件を満たす要素だけを選び出します。具体的には、リストのk番目のインデックスを「範囲値×2」で割った余りを計算し、その余りが範囲値以上であれば要素を採用し、未満であれば除外します。こうすることで、「s個の要素をスキップし、次のs個を取得する」というパターンを繰り返すことができます。
サンプルコード
range_slicing = [6,9,11,15,20,24,29,36,39,43,47,52,56,70,73,79]
print("与えられたリスト:", range_slicing)
# 範囲値
s = 4
# range() と len() を使用
result = [range_slicing[k] for k in range(len(range_slicing))
if k % (s * 2) >= s]
print("\n範囲スライス後のリスト:", result)
上記のコードを実行すると、以下の結果が出力されます。
与えられたリスト: [6, 9, 11, 15, 20, 24, 29, 36, 39, 43, 47, 52, 56, 70, 73, 79] 範囲スライス後のリスト: [20, 24, 29, 36, 56, 70, 73, 79]
結果を見ると、先頭の4要素(6, 9, 11, 15)と中間の4要素(39, 43, 47, 52)がスキップされ、それ以外の部分が抽出されていることがわかります。
方法2:enumerate()を使用する
次に、前述の方法と同じロジックを、enumerate()を使って実装します。range()とlen()を組み合わせる代わりに、enumerate()でインデックスと値を同時に取得できるため、コードがより簡潔になります。なお、リストの末尾の要素は割り算の条件を満たすため、結果に含まれる点に注意してください。
サンプルコード
range_slicing = [6,9,11,15,20,24,29,36,39,43,47,52,56,70,73,79]
print("与えられたリスト:", range_slicing)
# 範囲値
s2 = 5
# enumerate() を使用
result_2 = [val for m, val in enumerate(range_slicing)
if m % (s2 * 2) >= s2]
print("\n範囲スライス後のリスト:", result_2)
上記のコードを実行すると、以下の結果が出力されます。
与えられたリスト: [6, 9, 11, 15, 20, 24, 29, 36, 39, 43, 47, 52, 56, 70, 73, 79] 範囲スライス後のリスト: [24, 29, 36, 39, 43, 79]
この例では範囲値を5に設定しているため、インデックス0〜4の要素がスキップされ、インデックス5〜9の要素が採用されます。その後、再び5要素分がスキップされますが、リストの長さが16であるため、最後のインデックス15(値79)だけが条件を満たし、結果に含まれています。
まとめ
リストの交互範囲スライスは、インデックスに対する剰余演算(%)を条件として使うことで簡単に実装できます。range()とlen()の組み合わせでも、enumerate()でも同じ結果が得られますが、enumerate()の方がインデックスと値を同時に扱えるため、可読性の高いコードを書きやすくなります。用途に応じて使い分けるとよいでしょう。
-
Pythonでリストから指定したインデックスの複数要素を削除する方法
Pythonのリストから単一の要素を削除するのは、del文とインデックスを組み合わせれば簡単に行えます。しかし、複数のインデックスに該当する要素をまとめて削除したいケースでは、少し工夫が必要です。本記事では、削除対象となるインデックスのリストを指定して、元のリストから該当する要素だけを取り除く方法を2つ紹介します。方法1:sorted()とdelを組み合わせるこのアプローチでは、まず削除したい位置(インデックス)を格納したリストを作成します。その後、降順にソートしてから後ろの要素から順に削除することで、削除処理中にインデックスがずれる問題を回避し、元のリストの構造を保ったまま安全に要素を削除で
-
Python入門:リストスライスとリスト内包表記の基本を徹底解説
この記事では、Pythonにおけるリストスライス(list slicing)とリスト内包表記(list comprehension)について、初心者にもわかりやすく解説します。リストスライスとは?「スライス」という言葉は、文字通り「何かを小さく切り分ける」という意味です。リストスライスとは、元のリストから一部分だけを取り出す処理のことを指します。どこから切り出すか(開始位置)、どこで止めるか(終了位置)、どの間隔で切り出すか(ステップ数)を自由に指定できるのが特徴です。リスト内包表記とは?リスト内包表記は、既存のリストをもとに新しいリストを生成するための記法です。forループや条件式を1行にま