🎉

【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つずつ進みます

実行過程

  1. 最初にインデックス7の要素を取ります:値は「7」
  2. ステップ数が-1なので、1つ左に移動してインデックス6の要素を取ります:値は「6」
  3. さらに左に移動してインデックス5の要素を取ります:値は「5」
  4. さらに左に移動してインデックス4の要素を取ります:値は「4」
  5. さらに左に移動してインデックス3の要素を取ります:値は「3」
  6. 次はインデックス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] は二次元配列ではありません。

これはワンステップで行われるスライス操作です。

この式を分解すると:

  1. まず [10, 20, 30, 40, 50, 60] というリストを作成します
  2. そのリストに対して、すぐに [: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