Pythonのリスト(list)は、複数のデータを順序付けて格納する強力なデータ型です。このリストから、[0] のように単一の要素を取り出すだけでなく、「1番目から3番目まで」のように、一部の要素をまとめて切り出して新しいリストを作成する機能があります。
これが「スライス(Slicing)」構文です。スライスは、データ処理や分析、Web開発など、Pythonを使うあらゆる場面で不可欠な基本操作です。
この記事では、[start:stop:step] というスライス構文の基本的な使い方から、応用までを解説します。
スライス構文の基本 [start:stop:step]
スライスは、リスト変数名の直後に [] を置き、コロン(:)を使って範囲を指定します。
基本構文: my_list[start:stop:step]
start: スライスを開始するインデックス(位置番号)。このインデックスの要素は含まれます。stop: スライスを終了するインデックス。このインデックスの要素は含まれません(その直前まで)。step: 取得する要素の間隔(飛び幅)。
]
まずは、step を省略した最も基本的な [start:stop] の使い方から見ていきます。
1. 基本的なスライス [start:stop]
step を省略した場合、step は 1(全ての要素)であるとみなされます。
例として、曜日のリストを使用します。
weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
# インデックス: 0 1 2 3 4 5 6
start と stop の両方を指定
start は含まれ、stop は含まれない(その手前まで)というのが最大のポイントです。
# インデックス 1 ("Tue") から 4 ("Fri") の手前まで
# つまり [1] "Tue", [2] "Wed", [3] "Thu" を取り出す
mid_days = weekdays[1:4]
print(f"weekdays[1:4] -> {mid_days}")
実行結果:
weekdays[1:4] -> ['Tue', 'Wed', 'Thu']
2. start または stop の省略
スライス構文では、start や stop を省略できます。
startを省略 ([:stop]): リストの先頭(インデックス0)からstopの手前までを意味します。stopを省略 ([start:]):startからリストの最後までを意味します。
weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
# 1. 先頭からインデックス 3 ("Thu") の手前まで
# つまり [0], [1], [2]
first_three = weekdays[:3]
print(f"weekdays[:3] -> {first_three}")
# 2. インデックス 4 ("Fri") から最後まで
# つまり [4], [5], [6]
last_three = weekdays[4:]
print(f"weekdays[4:] -> {last_three}")
# 3. 両方を省略 ([:] )
# これはリスト全体のコピーを作成する一般的な方法
all_days_copy = weekdays[:]
print(f"weekdays[:] -> {all_days_copy}")
実行結果:
weekdays[:3] -> ['Mon', 'Tue', 'Wed']
weekdays[4:] -> ['Fri', 'Sat', 'Sun']
weekdays[:] -> ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
3. step を使ったスライス
step を指定すると、要素を「飛ばして」取得できます。
stepが2: 1つおきに取得します。stepが-1: リストを逆順にします。
numbers = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
# [start:stop:step]
# 0番目から最後まで、2つおきに (step=2)
even_tens = numbers[::2]
print(f"numbers[::2] -> {even_tens}")
# 1番目から最後まで、2つおきに
odd_tens = numbers[1::2]
print(f"numbers[1::2] -> {odd_tens}")
# リスト全体を逆順にする (step=-1)
reversed_nums = numbers[::-1]
print(f"numbers[::-1] -> {reversed_nums}")
実行結果:
numbers[::2] -> [0, 20, 40, 60, 80]
numbers[1::2] -> [10, 30, 50, 70, 90]
numbers[::-1] -> [90, 80, 70, 60, 50, 40, 30, 20, 10, 0]
4. 負のインデックスとスライス
スライスでは、末尾からの位置を示す負のインデックスも使用できます。
[-1]は最後の要素を指します。[-2]は最後から2番目の要素を指します。
stop 位置に負のインデックスを指定すると、「末尾からN個を除く」といった操作が簡単に行えます。
weekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
# 1. 先頭から、末尾の2要素 (-2) の手前まで
# つまり [0] から [4] まで
except_last_two = weekdays[:-2]
print(f"weekdays[:-2] -> {except_last_two}")
# 2. インデックス 1 から、末尾の1要素 (-1) の手前まで
# つまり [1] から [5] まで
center_part = weekdays[1:-1]
print(f"weekdays[1:-1] -> {center_part}")
実行結果:
weekdays[:-2] -> ['Mon', 'Tue', 'Wed', 'Thu', 'Fri']
weekdays[1:-1] -> ['Tue', 'Wed', 'Thu', 'Fri', 'Sat']
まとめ
- スライスの基本構文は
[start:stop:step]です。 startは含まれ、stopは含まれません。startを省略すると先頭から、stopを省略すると末尾までになります。stepを指定すると要素を飛ばして取得でき、[::-1]はリストの逆順コピーを作成するイディオムとして使われます。- スライスは、元のリストを変更せず、常に新しいリストを作成して返します。
