【Python】スライスの使いかたの基本

スライスは、リストや文字列、タプル等のシーケンス型の一部をインデックスを指定して取り出す操作のことです。うまく使うとリストの要素の反転も簡単に書けます。
本記事では、このようなスライス操作の基本について解説します。
# 2020/2/19 記事更新

確認に使った環境

  • OS:Ubuntu 16.04LTS
  • Python 3.7.4

スライスとは?

スライス 操作は、シーケンス(リスト、タプル、文字列等)の一部をインデックスを指定して切り取る操作のことです。
インデックスを指定するには、下記のように複数の数値をコロン(:)で区切って[ ]で囲います。

a[start : stop : step]

ここで、

  • start:切り取りたい部分の開始(一番左)のインデックス
  • stop:切り取りたい部分の終わり(一番右)のインデックス
  • step:何個ごとに抽出するか(デフォルト=1)

インデックスの指定の仕方は、下記の公式リファレンス が参考になります。

スライスの使い方をおぼえる良い方法は、インデックスが文字と文字の あいだ (between) を指しており、最初の文字の左端が 0 になっていると考えることです。そうすると、 n 文字からなる文字列中の最後の文字の右端はインデックス n となります。例えばこうです:

 +---+---+---+---+---+---+
 | P | y | t | h | o | n |
 +---+---+---+---+---+---+
 0   1   2   3   4   5   6
-6  -5  -4  -3  -2  -1

1行目の数字は文字列の 0 から 6 までのインデックスの位置を示しています; 2行目は対応する負のインデックスを示しています。i から j までのスライスは、それぞれ i と付いた境界から j と付いた境界までの全ての文字から成っています。

Python公式リファレンス 3.1.2. 文字列型 (string)

stopは設定した数値の一つ前までの文字が取り出される、ということに注意です。

また、スライス操作によって生成された新しいシーケンスは、元のシーケンスと同じ型になります。このとき、インデックスは0から始まるように新たに振り直されます。/p>

以下に例を示します。

  • リストの場合
  • >>> a = [1, 2, 3, 4, 5, 6, 7]
    >>> a[1:4]
    [2, 3, 4]
    
    >>> a[2:6:2]
    [3, 5]
  • 文字列の場合
  • >>> s = 'abcdefghi'
    >>> s[1:4]
    'bcd'
    
    >>> s[2:7:2]
    'ceg'

ここで、気をつける点があります。

リストや文字列の範囲外のインデックスを指定した場合は、下記の通りIndexErrorが返りますが、

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

# インデックス指定の場合はエラーが返る
>>> a[10]
Traceback (most recent call last):
  File "", line 1, in 
IndexError: list index out of range

スライスの場合はエラーが返らず「上手く」対処されます。
スライスのインデックス指定が間違っていても気が付かない可能性がありますので注意が必要です。

# スライスの場合:stopがリストの範囲を超えた場合も、存在する要素が返る
>>> a[:10]
[1, 2, 3, 4, 5, 6, 7]

# スライスの場合:下記の場合は空が返ります
>>> a[10:]
[]

スライス操作の書き方の例

startを省略して(:)を指定

最初の要素からstopで指定した要素の一つ前までの要素を返します。

# リストの場合
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a[:5]
[1, 2, 3, 4, 5]

# 文字列の場合
>>> s = 'abcdefghi'
>>> s[:6]
'abcdef'

stopを省略して(:)を指定

start番目の要素から最後の要素を返します。

# リストの場合
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a[3:]
[4, 5, 6, 7]

# 文字列の場合
>>> s = 'abcdefghi'
>>> s[3:]
'defghi'

マイナスのインデックスを指定する

インデックスを後ろから指定できます。start = -1とすると末尾の要素を取得します。

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

# startにマイナス指定
>>> a[-1] # 末尾の要素
7
>>> a[-3]
5

# start:stop マイナス指定 (start < stop となることに注意!)
>>> a[-5:-1]
[3, 4, 5, 6]

# start > stop とすると空が返ります。
>>> a[-1:-5]
[]

stepにマイナス指定をすると、末尾から並びます。

# stepにマイナス値を指定
>>> a[-1:-5:-1]
[7, 6, 5, 4]

これを利用すると、シーケンスの要素を反転させて表示できます。

# リストの場合
>>> a = [1, 2, 3, 4, 5, 6, 7]
>>> a[::-1]
[7, 6, 5, 4, 3, 2, 1]

# 文字列の場合
>>> s = 'abcdefg'
>>> s[::-1]
'gfedcba'

2次元配列リスト、3次元配列リストの指定方法

2次元配列は下記のようにインデックス指定します。

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

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

>>> a[0][1]
2

3次元配列も同様にして下記のように指定します。

>>> b = [[[1,2,3], [4,5,6]],[[7,8,9],[10,11,12]]]

>>> b[0]
[[1, 2, 3], [4, 5, 6]]

>>> b[0][0]
[1, 2, 3]

>>> b[0][0][1]
2

4次元以降も同様に指定していきます。複雑ですが。。

<参考> slice()関数

上記の[]で表すスライス構文は、slice オブジェクトを内部で利用しています。
sliceオブジェクトは、Pythonの組み込み関数slice() によって生成されます。
使い方は以下です。

class slice(stop) または class slice(start, stop[, step])

この関数は、range(start, stop, step) で指定されるインデクスの集合を表す、スライス (slice) オブジェクトを返します。引数のstart、stop、stepはデフォルトはNoneです。

>>> s = slice(2, 5)
>>> s
slice(2, 5, None)
>>> type(s)
<class 'slice'>

start, stop, stepは下記の通り取り出せます。

>>> s.start
2
>>> s.stop
5
>>> s.step
>>> print(s.step)
None

ただ、この関数はあまり使うことはなさそうですね。。

まとめ

今回は、スライス操作の基本についてまとめました。

  • スライス操作は、シーケンス(リスト、タプル、文字列等)の一部をインデックスを指定して切り取る操作のこと。a[start:stop:step]と書ける
  • 要素の並びを反転させるには、a[::-1]で出来る。

 

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!


One Reply to “【Python】スライスの使いかたの基本”

コメントは受け付けていません。