Python

Python3入門 リストや文字列を切取るスライス操作の基礎

投稿者 : OSCA

 ここでは、リスト(配列)や文字列の一部を切取る「スライス」の基本的な操作方法について解説します。

スライスとは?

 スライスとは、リスト(配列)や文字列のいち部分を切取る操作のことです。 次のような操作を行いたい場合に利用すると便利です。

  • 長さが「5」のリストの中から、3番目〜4番目の値だけを切り出す。
  • 文字列の中から、先頭の3文字だけを切り出す。 (先頭でも、間でも、末尾でも良い)

 スライスは、次の例のように、リストや文字列の変数名の後ろに切り出したい箇所を指定することで行うことができます。

変数名[開始インデックス位置:終了インデックス位置]

 詳しい用法は次節から説明しますが、利用する際に注意しないといけないことは次の通りです。

  • インデックス位置は「0」からカウントされる。
  • 切り出すは、終了インデックス位置の直前まで行われる。 (=終了インデックス位置までではない!)

 それではサンプルを示して、詳しい使い方を見ていきましょう。

リスト(配列)を切取る

それではさっそく、リストの一部を切取るサンプルを示し、スライスがどのようなものなのかを解説していきます。

小文字の「a」から「e」までを値として持つリストを宣言し、そのリストの一部を切り取ってみましょう。 次の例を見てください、長さが5のリストの中から3番目〜4番目までの値を切り出しています。 リストのインデックスは0から始まりますので、開始インデックスに「3」を、終了インデックスは前述の通り指定したインデックスの手前までを切取るので「4」を指定します。

arr = ['a', 'b', 'c', 'd', 'e']
print(arr[2:4])
['c', 'd']

スライスの開始インデックス位置を「0」とする場合、記述を省略することができます。 次の2つ操作はどちらも同じ結果を返却します。

arr = ['a', 'b', 'c', 'd', 'e']
print(arr[0:4])
print(arr[:4])
['a', 'b', 'c', 'd']
['a', 'b', 'c', 'd']

また、終了インデックス位置をリストの最後とする場合も、記述を省略することができます。 次の2つの操作はどちらも同じ結果を返却します。

arr = ['a', 'b', 'c', 'd', 'e']
print(arr[2:5])
print(arr[2:])
['c', 'd', 'e']
['c', 'd', 'e']

文字列を切取る

スライスは、リストだけではなく文字列に対しても操作することができます。 「文字列は文字の配列」だという考え方をすれば難しくありません。

文字列「abcde」があり、その中から3文字目から4文字目までを切り取りたい場合は、次のようにスライスの指定をしてあげれば良いです。

str = "abcde"
print(str[2:4])
cd

配列の例と同様に、開始インデックス位置を文字列の最初とする場合はスライスの指定を省略できます。次の2つの例では、どちらも同じ結果を返却します。

str = "abcde"
print(str[0:4])
print(str[:4])
abcd
abcd

終了インデックス位置を文字列の最後とする場合も同様に省略することができます。 次の2つの例では、どちらも同じ結果を返却します。

str = "abcde"
print(str[2:5])
print(str[2:])
cde
cde

NumPy配列を切取る

Python で便利に配列を扱うためのライブラリに NumPy があります。 スライスは NumPy の配列にも利用することができます。

import numpy as np

arr = np.array(['a','b','c','d','e'])
print(arr[2:5])
print(arr[:4])
print(arr[2:])
['c' 'd' 'e']
['a' 'b' 'c' 'd']
['c' 'd' 'e']

NumPy 配列に関しては、多次元配列についてもスライスすることができる。 次の例は、3列3行の二次元配列の中から、[1,1]の位置の要素だけを切取る例です。

import numpy as np

arr = np.array([
    ['x1', 'y1', 'z1'],
    ['x2', 'y2', 'z2'],
    ['x3', 'y3', 'z3']
])
print(arr[1:2,1:2])
[['y2']]

同じことを標準のリストで行おうとすると、次の例のようにエラーになってしまいます。 (この理由についてご存知の方がいたら、是非共有して頂きたいです)

arr = [
    ['x1', 'y1', 'z1'],
    ['x2', 'y2', 'z2'],
    ['x3', 'y3', 'z3']
]
print(arr[1:2,1:2])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-df28eaaafc74> in <module>()
      4     ['x3', 'y3', 'z3']
      5 ]
----> 6 print(arr[1:2,1:2])

TypeError: list indices must be integers or slices, not tuple

NumPy配列の多次元配列の操作の例をいくつか示します。 例えば3行3列の多次元配列の中から、1列目だけを取出したい場合は、次の例のように [:,:1] と指定します。

import numpy as np

arr = np.array([
    ['x1', 'y1', 'z1'],
    ['x2', 'y2', 'z2'],
    ['x3', 'y3', 'z3']
])
print(arr[:,:1])
[['x1']
 ['x2']
 ['x3']]

同様に、2列〜3列目だけを取出したい場合は [:,1:] を指定します。

import numpy as np

arr = np.array([
    ['x1', 'y1', 'z1'],
    ['x2', 'y2', 'z2'],
    ['x3', 'y3', 'z3']
])
print(arr[:,1:])
[['y1' 'z1']
 ['y2' 'z2']
 ['y3' 'z3']]

おわりに

本稿では Python のスライス操作について解説しました。 配列のインデックス番号の概念が理解できていれば、あまり難しくありませんね。

著者 : OSCA

OSCA

Java, PHP 系のWEBエンジニア。 WEBエンジニア向けコミュニティ「WEBエンジニア勉強会」を主催。
個人として何か一つでも世の中の多くの人に使ってもらえるものを作ろうと日々奮闘中。
@engineer_osca