Python | データ構造:list のスライス

Python
スポンサーリンク

スライスの概要(リストの一部を取り出す・作り替える)

スライスは、リストの「部分」を取り出したり、まとめて置き換えたり、挿入・削除したりできる強力な機能です。基本構文は 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 は含まれないなどのルールを正しく押さえ、ループ中の位置ずれには「新リストの構築」や「コピーを回す」設計で対処しましょう。これを身につければ、部分処理・整形・クレンジングがぐっとシンプルに、安全に書けるようになります。

タイトルとURLをコピーしました