Pythonのスライス

  • 2
    いいね
  • 0
    コメント

スライス

スライスを使ってリストの要素を部分的に取得できる。

インデックス1〜3の要素を取得

>>> a = [1,2,3,4,5,6,7,8,9]

>>> a[1:4]
[2, 3, 4]

※ 終端は インデックス + 1の値となる

ステップを指定

>>> a = [1,2,3,4,5,6,7,8,9]

>>> a[1:8:2]          # インデックス1〜7の要素を2ステップで
[2, 4, 6, 8]

最後の要素にアクセス

>>> a = [1,2,3,4,5,6,7,8,9]
>>> a[-1] 
9

-1は一番後ろの要素で、-2は後ろから2番目の要素、-3は。。。(略)

>>> a[-2]
8

>>> a[-3]
7

>>> a[-4]
6


スライスではインデックスをオーバーしてもエラーにならない

>>> a = [1,2,3,4,5,6,7,8,9]

>>> a[5:20]
[6, 7, 8, 9]

>>> a[-100:4]
[1, 2, 3, 4]

一番最初から~○○まで

先頭を省略すると「一番最初」の要素を示す

>>> a[0:4]
[1, 2, 3, 4]

>>> a[:4]
[1, 2, 3, 4]

は同義

○○から~一番後ろまで

末尾を省略すると「一番最後」の要素を示す

>>> a[5:len(a)]
[6, 7, 8, 9]

>>> a[5:]
[6, 7, 8, 9]

は同義

>>> a = [1,2,3,4,5,6,7,8,9]
>>> a[-4:]
[6, 7, 8, 9]

なんてこともできる

すべての要素を指定

>>> a[0:len(a)]

>>> a[:]

または

>>> a[::]

は同義

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> a[0:len(a)]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> a[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> a[::]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

スライスされたリストは、元のリストとは別インスタンス

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> b = a[-5:]
>>> b
[5, 6, 7, 8, 9]

>>> b[1] = 60
>>> b
[5, 60, 7, 8, 9]

# 元リストはコピーしたリストとは別インスタンスなので、変更の影響を受けない
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9]


マイナスのステップ

先にふれたようにスライスではステップが指定できた。

>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[3:8:2]  # インデックス 3〜7を2ステップで
[4, 6, 8]

以下のようにすると逆方向にスライスできる。

>>> a[7:2:-2]   # インデックス7〜3を-2ステップで
[8, 6, 4]

範囲を全指定にしてマイナスステップにすると、要素がリバースする。

>>> a[::-1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

文字列に対して

文字列に対しても同じく以下のように。

>>> txt = '123456789'

>>> txt[1:4]
'234'

>>> txt[-1]
'9'

>>> txt[:4]
'1234'

>>> txt[5:]
'6789'

>>> txt[::-1]
'987654321'