Python

【Python】シーケンスの要素を任意の範囲で取得するスライスの使い方

この記事では、Python のスライスの使い方を解説します。

スライスは、シーケンスオブジェクトの要素を範囲で選択できます。選択した要素は、取得・変更・削除を行うことができます。

それでは、スライスの使い方を見ていきましょう!

スライスの基本

スライスを使うことでシーケンスの要素を指定した範囲で取得することができる。例えば [1, 2, 3, 4, 5] のリストから [2, 3, 4] のみを取得できたりする。

スライスは以下のようにシーケンスに ブラケット([]) と コロン() を用いて startstopstep を指定します。

シーケンス[start:stop:step]

startstopstepは、どれも省略可能です。

スライスは、シーケンスオブジェクト に使用可能

スライスで選択した要素は、取得・代入・削除が行える。

l = [1, 2, 3, 4, 5]

# l[1] ~ l[3]を取得
print(l[1:4])

# l[1] ~ l[3]に10, 11を代入
l[1:4] = 10, 11
print(l)

# l[1] ~ l[2]の要素を削除
del l[1:3]
print(l)

実行結果

[2, 3, 4]
[1, 10, 11, 5]
[1, 5]

それでは、スライスを使って範囲を指定する方法を見ていきましょう❗️

範囲内の要素の取得: [start:stop]

startstop を指定することで start <= N < stop の要素を取得できます。

シーケンス[start:stop]

サンプル

以下のコードでは 2 <= N < 4 の範囲の要素を取得します。

l = [1, 2, 3, 4, 5, 6, 7]
print(l[2:4])

実行結果

[3, 4]

start > stop だと値は取得できません。

l = [1, 2, 3, 4, 5, 6, 7]
print(l[4:2])

実行結果

[]

先頭からstopまでの要素の取得: [:stop]

stop のみを指定することで 0 <= N < stop の要素を取得できます。コロン(:)を忘れずに記述しましょう。

シーケンス[:stop]

これは以下のコードと等価です。

シーケンス[0:stop]

サンプル

以下のコードは 0 <= N < 4 の要素を取得しています。

l = [1, 2, 3, 4, 5, 6, 7]
print(l[:4])

実行結果

[1, 2, 3, 4]

コロン(:)を忘れると通常のインデックス呼び出しになってしまうので注意。

l = [1, 2, 3, 4, 5, 6, 7]
print(l[4])

実行結果

5

startから末尾までの要素の取得: [start:]

start のみ指定することで start から末尾までの要素を取得できます。こちらもコロン(:)を忘れないように注意しましょう。

シーケンス[start:]

これは以下のコードと等価です。

シーケンス[start:len(シーケンス)]

サンプル

以下のコードは 2 <= N < len(vals) の範囲の要素を取得しています。

l = [1, 2, 3, 4, 5, 6, 7]
print(l[2:])

実行結果

[3, 4, 5, 6, 7]

要素を飛ばして取得する: [::step]

step を指定することで要素を取得する間隔を指定できます。コロン(:)2つを忘れずに記述しましょう。

シーケンス[::step]

startstop は省略しましたが、もちろん指定することもできます。

シーケンス[start:stop:step]

サンプル

異なる step を指定して取得される要素がどのようになるか見てみましょう!

l = [1, 2, 3, 4, 5, 6, 7]

print(l[::2])
print(l[::3])

実行結果

[1, 3, 5, 7]
[1, 4, 7]

step が 2の場合は、1つ空けて要素が取得されました。step が 3の場合は、2つ空けて要素が取得されました。

末尾から要素を取得する

スライスにマイナスの値を指定することで、末尾から要素を指定することができます。

startに負の数を指定する

末尾からの要素を start に指定できます。

l = [1, 2, 3, 4, 5, 6, 7]

print(l[-1:])
print(l[-2:])
print(l[-3:])
print(l[-4:])

実行結果

[7]
[6, 7]
[5, 6, 7]
[4, 5, 6, 7]

stopに負の数を指定する

末尾からの要素を stop に指定できます。

l = [1, 2, 3, 4, 5, 6, 7]

print(l[:-1])
print(l[:-2])
print(l[:-3])
print(l[:-4])

実行結果

[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5]
[1, 2, 3, 4]
[1, 2, 3]

startとstopに負の数を指定する

startstop に負の数を指定する際は、stop の方が後ろの要素を指定しているか注意が必要です。

l = [1, 2, 3, 4, 5, 6, 7]

print(l[-2:-1])
print(l[-3:-1]) 
print(l[-4:-1])

実行結果

[6]
[5, 6]
[4, 5, 6]

stepに負の数を指定する

step に負の数を指定することで逆順で要素を取得できます。

l = [1, 2, 3, 4, 5, 6, 7]

print(l[::-1])
print(l[::-2])
print(l[::-3])

実行結果

[7, 6, 5, 4, 3, 2, 1]
[7, 5, 3, 1]
[7, 4, 1]

step に負の数を指定した場合に startstop を指定するには以下のようになる。

l = [1, 2, 3, 4, 5, 6, 7]

print(l[-1:-8:-1])
print(l[-1:-7:-1])

print(l[6::-1])
print(l[5:2:-1])

実行結果

[7, 6, 5, 4, 3, 2, 1]
[7, 6, 5, 4, 3, 2]
[7, 6, 5, 4, 3, 2, 1]
[6, 5, 4]

ふむ...これはややこしい❗️
この書き方はわかりにくいのであまり使わない方が良いかもしれませんね。

スライスオブジェクト

slice() でスライスオブジェクトを生成することができます。ブラケット([])内にスライスオブジェクトを指定することで、その範囲で要素を選択できます。

slice(stop)
slice(start, stop[, step])

スライスオブジェクトを用いて範囲を指定して見ましょう!

l = [1, 2, 3, 4]

# スライスオブジェクト生成
s_o = slice(1, 3)
print(l[s_o])

実行結果

[2, 3]

まとめ

この記事では、Python のスライスについて解説しました。

スライスを使うことでシーケンス型の要素を複雑に範囲選択することができました。特定の範囲の要素を取得したいだけなら for文 を使わずにスライスを使いましょう!

今回の内容はここまでです。それではまたどこかで〜( ・∀・)ノ