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つ空けて要素が取得されました。

末尾から要素を取得する

スライスのstartstopstepに負の値を指定することで末尾から要素を指定することができます。それぞれの挙動を見てみましょう。

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に負の数を指定した場合にstartstopを指定するには以下のようになる。

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文を使わずにスライスを使いましょう!

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