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]

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に負の数を指定する

末尾からの要素を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に負の数を指定する

startとstopに負の数を指定する際は、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に負の数を指定した場合に、startとstopを指定するには以下のようになります。

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

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

最短3か月でエンジニア転職『DMM WEBCAMP COMMIT』