【Python】スライス記法(slice notation)について
スライス記法は、リストや文字列から一部分を取り出すための便利な方法です。
まるでケーキを切り分けるように、データの一部を簡単に取り出せます!
スライス記法の基本
スライス記法は、[開始位置:終了位置:ステップ数]
という形で書きます。
終了位置は、ここの手前まで取ります。ですので、この位置自体は含みません。
ちょっと難しそうに聞こえるかもしれませんが、実際に使ってみるととても簡単ですよ。
my_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(my_list[2:7]) # [2, 3, 4, 5, 6]
この例では、my_list
の2番目から7番目の手前までの要素を取り出しています。つまり、インデックス2から6までの要素が表示されます。
インデックスは0から始まる
大事なポイントですが、Pythonでは数え方が0から始まります!
1番目の要素はインデックス0、2番目の要素はインデックス1というふうに考えましょう。
fruits = ['りんご', 'バナナ', 'オレンジ', 'ぶどう', 'メロン']
print(fruits[0]) # りんご
print(fruits[1]) # バナナ
開始位置と終了位置を省略する
スライス記法では、開始位置や終了位置を省略することもできます。
省略すると、開始位置は0、終了位置はリストの長さになります。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[:5]) # [0, 1, 2, 3, 4]
print(numbers[5:]) # [5, 6, 7, 8, 9]
print(numbers[:]) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ステップ数を指定する
3つ目のパラメータ「ステップ数」を使うと、要素を飛ばし飛ばしで取り出すことができます。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[1:8:2]) # [1, 3, 5, 7]
この例では、インデックス1から8の手前まで、2つずつ飛ばして取り出しています。
まるでひとつ飛ばしで席に座るような感じですね!
マイナスのインデックス
Pythonでは、マイナスのインデックスを使うこともできます。
これは後ろからの位置を表します。
-1は最後の要素、-2は後ろから2番目の要素を指します。
fruits = ['りんご', 'バナナ', 'オレンジ', 'ぶどう', 'メロン']
print(fruits[-1]) # メロン
print(fruits[-3:]) # ['オレンジ', 'ぶどう', 'メロン']
マイナスのステップ数
ステップ数にマイナスを指定すると、逆順に要素を取り出すことができます。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(numbers[7:2:-1]) # [7, 6, 5, 4, 3]
ちなみに、[::-1]
は、リスト全体を逆順にする魔法の呪文みたいなものです!
ここで、上記のprint(numbers[7:2:-1])
の出力が [7, 6, 5, 4, 3]
になる仕組みを分かりやすく説明します。
この部分は確かに少し分かりにくいかもしれません。ステップバイステップで見ていきましょう。
スライス記法のおさらい
まず、スライス記法 [開始位置:終了位置:ステップ数]
の基本を思い出しましょう。
- 開始位置:ここから取り始める位置
- 終了位置:ここの手前まで取る(この位置自体は含まない)
- ステップ数:何個飛ばしで取るか(正の数なら左から右へ、負の数なら右から左へ)
numbers[7:2:-1]
を分解する
元のリストは次のようになっています:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
インデックス: 0 1 2 3 4 5 6 7 8 9
numbers[7:2:-1]
では:
- 開始位置は 7:インデックス7から始めます(値は「7」)
- 終了位置は 2:インデックス2の手前で終わります(インデックス2は含まない)
- ステップ数は -1:後ろ向き(右から左)に1つずつ進みます
実行過程
- 最初にインデックス7の要素を取ります:値は「7」
- ステップ数が-1なので、1つ左に移動してインデックス6の要素を取ります:値は「6」
- さらに左に移動してインデックス5の要素を取ります:値は「5」
- さらに左に移動してインデックス4の要素を取ります:値は「4」
- さらに左に移動してインデックス3の要素を取ります:値は「3」
- 次はインデックス2ですが、終了位置がインデックス2なので、ここは含まれません(手前で終了)
そのため、結果は [7, 6, 5, 4, 3]
となります。
文字列でのスライス
スライス記法は文字列にも使えます!文字列は文字のリストのようなものと考えられるからです。
message = "こんにちは、Python!"
print(message[0:5]) # こんにちは
print(message[6:]) # Python!
print(message[::-1]) # !nohtyP、はちにんこ
実用的な例
スライス記法を使った実用的な例をいくつか見てみましょう。
例1: リストの最初の3つの要素を取り出す
top_three = [10, 20, 30, 40, 50, 60][:3]
print(top_three) # [10, 20, 30]
ここで[10, 20, 30, 40, 50, 60][:3]
は二次元配列ではありません。
これはワンステップで行われるスライス操作です。
この式を分解すると:
- まず
[10, 20, 30, 40, 50, 60]
というリストを作成します - そのリストに対して、すぐに
[:3]
というスライス操作を適用しています
[:3]
は「インデックス0から3の手前まで(つまり0, 1, 2のインデックスの要素)を取り出す」という意味になります。
つまり、以下のコードと同じ動作をしています:
temp_list = [10, 20, 30, 40, 50, 60]
top_three = temp_list[:3]
print(top_three) # [10, 20, 30]
二次元配列であれば、例えば以下のようになります:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[0][1]) # 2 (0行目の1列目の要素)
例2: リストの最後の2つの要素を取り出す
last_two = [10, 20, 30, 40, 50][-2:]
print(last_two) # [40, 50]
例3: 偶数番目の要素だけを取り出す
even_indices = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][::2]
print(even_indices) # [0, 2, 4, 6, 8]
スライス記法のまとめ
スライス記法の基本形を表にまとめておきます:
書き方 | 意味 |
---|---|
a[start:stop] |
インデックスstartからstop-1までの要素 |
a[start:] |
インデックスstartから最後までの要素 |
a[:stop] |
最初からインデックスstop-1までの要素 |
a[:] |
リスト全体のコピー |
a[start:stop:step] |
インデックスstartからstop-1まで、stepずつ飛ばした要素 |
a[::-1] |
リストを逆順にしたもの |
練習問題
以下のリストを使って、スライス記法を練習してみましょう:
data = [10, 20, 30, 40, 50, 60, 70, 80, 90]
# 問題1: 最初の3つの要素を取り出してみよう
result1 = data[:3]
print(result1) # [10, 20, 30]
# 問題2: 最後の4つの要素を取り出してみよう
result2 = data[-4:]
print(result2) # [60, 70, 80, 90]
# 問題3: 2つ飛ばしで全要素を取り出してみよう
result3 = data[::2]
print(result3) # [10, 30, 50, 70, 90]
# 問題4: 真ん中の3つの要素を取り出してみよう
result4 = data[3:6]
print(result4) # [40, 50, 60]
# 問題5: リストを逆順にしてみよう
result5 = data[::-1]
print(result5) # [90, 80, 70, 60, 50, 40, 30, 20, 10]
Pythonのスライス記法、とても便利ですよね!
初めは少し複雑に感じるかもしれませんが、使っていくうちにどんどん慣れていきます。
スライス記法をマスターすれば、リストや文字列を自由自在に操れるようになります。
Discussion