スライスの概要(リストの一部を取り出す・作り替える)
スライスは、リストの「部分」を取り出したり、まとめて置き換えたり、挿入・削除したりできる強力な機能です。基本構文は a[start:stop:step] で、start から始め、stop の「手前」まで、step 間隔で要素を選びます。結果は新しいリスト(取り出しの場合)で、スライス代入では元のリストをその場で変更できます。
基本構文と半開区間(ここが重要)
開始・終了・ステップの意味
start は取り出し開始位置、stop は「含まれない終了位置」、step は間引き間隔です。stop が「含まれない半開区間」であることが最重要ポイントで、±1のミスを防ぐ鍵になります。
a = [0, 1, 2, 3, 4, 5]
print(a[1:4]) # [1, 2, 3](4は含まれない)
print(a[::2]) # [0, 2, 4](2おき)
Python省略のルール(端から・末尾まで・等間隔)
start を省略すると先頭から、stop を省略すると末尾まで、step を省略すると 1 とみなされます。よく使う「先頭から指定位置まで」や「指定位置から末尾まで」が簡潔に書けます。
a = [0, 1, 2, 3, 4, 5]
print(a[:3]) # [0, 1, 2](先頭から3の手前まで)
print(a[3:]) # [3, 4, 5](3から末尾まで)
Python逆方向と負のステップ(深掘り)
逆順の取り出しと区間の向き
step を負数にすると逆順に辿ります。逆方向では start が stop より右側(インデックスが大きい側)になるように指定します。逆順コピーの定番は a[::-1] で、簡潔に全体反転が作れます。
a = [0, 1, 2, 3, 4, 5]
print(a[5:2:-1]) # [5, 4, 3](5→4→3、2は含まない)
print(a[::-1]) # [5, 4, 3, 2, 1, 0](全体を逆順コピー)
Python負のインデックス(末尾基準)
-1 は末尾、-2 は末尾から2番目…という指定が使えます。末尾近辺の抽出に直感的です。
a = [10, 20, 30, 40, 50]
print(a[-3:]) # [30, 40, 50]
print(a[:-2]) # [10, 20, 30]
Pythonスライス代入(置換・挿入・削除)
まとめて置換(長さが変わっても良い)
スライスの左辺に代入すると、その範囲を別のシーケンスで置き換えます。右辺の要素数は自由で、短くしても長くしても構いません。
nums = [1, 2, 3, 4, 5]
nums[1:4] = [20, 30] # 2,3,4 → 20,30 に置換(短くなる)
print(nums) # [1, 20, 30, 5]
Python挿入(空範囲に代入)
start と stop を同じにして「空の範囲」に代入すると、その位置へ挿入になります。
nums = [1, 2, 3]
nums[2:2] = [99, 100] # インデックス2の位置へ挿入
print(nums) # [1, 2, 99, 100, 3]
Python削除(空シーケンスを代入)
削除は、範囲に空リストを代入するのがシンプルです。del と違い、書き方を統一できます。
nums = [1, 20, 99, 100, 30, 5]
nums[1:4] = [] # まとめて削除
print(nums) # [1, 30, 5]
Pythonよくある落とし穴と安全策(重要ポイント)
step=0 は不可、float も不可
step は 0 にできず、整数のみです。小数刻みが必要なら整数スケール(例: 0.5刻みならインデックスを2倍)で設計しましょう。
a = list(range(10))
# a[::0] # エラー
Python端の含まれ方の勘違いに注意(半開区間)
stop は「含まれない」ため、目的の最終要素の「ひとつ後」を指定します。例:1〜3が欲しいなら [1:4]。境界テストでズレを防ぎましょう。
ループ中の削除・挿入は位置ずれに注意
走査しながらスライス代入で消す・入れると、インデックスが詰まって見落としが生じます。安全策は「新しいリストを作る」か「コピーを回す」ことです。
items = ["x", "bad", "y", "bad", "z"]
items = [v for v in items if v != "bad"] # 条件で一括削除
print(items) # ["x", "y", "z"]
Python例題で身につける(定番から一歩先まで)
例題1:部分抽出と逆順コピー
text = ["A", "B", "C", "D", "E"]
print(text[1:4]) # ["B", "C", "D"]
print(text[::-1]) # ["E", "D", "C", "B", "A"]
Python例題2:配列の間引き(偶数番目だけ)
nums = [0, 1, 2, 3, 4, 5, 6]
print(nums[::2]) # [0, 2, 4, 6]
Python例題3:ヘッダー挿入・フッター直前への挿入
rows = [
["coffee", 350, 2],
["tea", 280, 1],
["footer", "-", "-"],
]
rows[0:0] = [["item", "price", "qty"]] # 先頭へ挿入
rows[-1:-1] = [["summary", 630, 3]] # 末尾直前へ挿入
for r in rows:
print(r)
Python例題4:区間置換と一括削除でクレンジング
fields = ["name", "", "email", "phone", ""]
fields[:] = [f for f in fields if f] # 空文字を一括除去(全体置換)
print(fields) # ["name", "email", "phone"]
Pythonまとめ
スライスは a[start:stop:step] の半開区間で「取り出し」と「代入による作り替え」を一貫して扱える、Pythonの強力な基本機能です。逆順や負のインデックス、挿入・削除・置換を短い記述で表現でき、可読性と生産性に直結します。step=0 が不可、stop は含まれないなどのルールを正しく押さえ、ループ中の位置ずれには「新リストの構築」や「コピーを回す」設計で対処しましょう。これを身につければ、部分処理・整形・クレンジングがぐっとシンプルに、安全に書けるようになります。
