この記事では、Pythonのスライスの使い方を解説します。
リストなどのシーケンスを使っていると複数の要素にアクセスしたい場面が多々あります。そんな時は、スライスでまとめて要素を指定することができます。
スライスは、リスト含むシーケンスオブジェクトの要素を範囲で選択できます。選択した要素は、取得・変更・削除を行うことができます。
それでは、スライスの使い方を見ていきましょう!
スライスの基本
スライスを使うことでシーケンスの要素を指定した範囲で取得することができる。例えば、[1, 2, 3, 4, 5]
のリストから[2, 3, 4]
のみを取得できたりする。
スライスは以下のようにシーケンスに[]
と:
を用いてstart
、stop
、step
を指定します。
シーケンス[start:stop:step]
start
、stop
、step
は、どれも省略可能です。
シーケンスについては以下の記事を参照してください。
スライスで選択した要素は、取得・代入・削除が行える。
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]
start
とstop
を指定することで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]
start
とstop
は省略しましたが、もちろん指定することもできます。
シーケンス[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
、stop
、step
に負の値を指定することで末尾から要素を指定することができます。それぞれの挙動を見てみましょう。
l = [1, 2, 3, 4, 5, 6, 7]
# startに負の数を指定する
print(l[-1:]) # [7]
print(l[-2:]) # [6, 7]
print(l[-3:]) # [5, 6, 7]
print(l[-4:]) # [4, 5, 6, 7]
# stopに負の数を指定する
print(l[:-1]) # [1, 2, 3, 4, 5, 6]
print(l[:-2]) # [1, 2, 3, 4, 5]
print(l[:-3]) # [1, 2, 3, 4]
print(l[:-4]) # [1, 2, 3]
# startとstopに負の数を指定する
print(l[-2:-1]) # [6]
print(l[-3:-1]) # [5, 6]
print(l[-4:-1]) # [4, 5, 6]
step
に負の数を指定することで逆順で要素を取得できます。
l = [1, 2, 3, 4, 5, 6, 7]
print(l[::-1]) # [7, 6, 5, 4, 3, 2, 1]
print(l[::-2]) # [7, 5, 3, 1]
print(l[::-3]) # [7, 4, 1]
step
に負の数を指定した場合にstart
とstop
を指定するには以下のようになる。
l = [1, 2, 3, 4, 5, 6, 7]
print(l[-1:-8:-1]) # [7, 6, 5, 4, 3, 2, 1]
print(l[-1:-7:-1]) # [7, 6, 5, 4, 3, 2]
print(l[6::-1]) # [7, 6, 5, 4, 3, 2, 1]
print(l[5: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
文を使わずにスライスを使いましょう!
今回の内容はここまでです。それではまたどこかで〜( ・∀・)ノ