Pythonのスライス操作について徹底解説

この記事を書いた人
北爪 聖也

株式会社pipon代表取締役。 キャリアはADK(広告代理店)でテレビ広告運用をして残業120時間するが、ネット広告では自分の業務がAIで自動化されていることに驚愕する。そこで、機械学習受託会社に転職し、技術力を身につけた後、piponを創業。現在、製薬業界、大手監査法人、EC業界、様々な業界でAI受託開発事業を運営。

1.はじめに

今回は、Pythonにおけるスライス操作を詳しく紹介します。

「スライス」とは、シーケンス型のオブジェクトから、一部の要素を取り出して新しいオブジェクトを作成できる機能です。

ここでシーケンス型のオブジェクトとは、文字列やリストのように順番に意味があるオブジェクトのことです。

データ解析の際は、アルゴリズムの作成に用いる特徴量を元のデータベースから指定して取り出すなど、スライスを使う場面はとても多いので、スライスを自由自在に扱えるようになることは、とても大切なことです。

今回は、文字列、リスト、タプル、配列に対して、スライスのやり方を見ていきます。

2. スライス操作の詳細

それでは、Pythonでのスライスの方法を順番に見ていきます。

1) 文字列

文字列のスライスを行う前に、要素の順番の数え方を確認しておきましょう。

文字列から文字を取り出すには、[ ]を使います。[ ]には、取り出す文字の位置を指定しますが、1文字目を0とするのに注意が必要です。位置にマイナスをつけると、後ろから数えることを示し、-1が最後の文字となります。

文字の位置を示す数字をインデックス番号と呼びます。

例えば、上記の文字列をrei=”ABCDEFGHI”で定義したとすると、

rei[1]

と書けば「B」を得ることができます。

位置を0から数えるのが、プログラミングに馴染みがない方には間違えやすいところですが、色々な場面で出てきますので、必ずマスターしてください。

文字位置をインデックス番号の範囲で指定すると、部分文字列(文字列の一部)を取り出すことができ、これがスライス操作です。

文字列[開始位置 : 終了位置]

文字列のスライスの例を、例文1に示します。

<例文1>

moji = "QW123ERTY"

#全部を取り出す
print(moji[:])

#4文字目から最後まで
print(moji[3:])

#3文字目から5文字目の手前まで
print(moji[2:4])

#先頭から、後ろから数えて2文字目の手前まで
print(moji[:-2])
QW123ERTY
23ERTY
12
QW123ER

終了位置の要素は含まないことに注意してください。

文字位置に、ステップのオプションをつけることもできます。ステップとは1文字おき、2文字おきのように、飛び飛びで文字を取り出したいときに便利なオプションです。

文字列[開始位置 : 終了位置 : ステップ]

例文2ではステップを2にしているので、1文字目から1文字おきに、1文字目、3文字目、5文字目のように文字を取り出します。

<例文2>

moji = "QW123ERTY"

print(moji[::2])
Q13RY

ステップをマイナスの値で指定すると、文字を後ろから取り出すことができます(例文3)。

<例文3>

moji = "QW123ERTY"

print(moji[::-2])
YR31Q

なお、開始位置と終了位置を省略してステップに-1を指定すると、逆順の文字列を作ることができます(例文4)。

<例文4>

moji = "QW123ERTY"

print(moji[::-1])
YTRE321WQ

2) リスト

リストに含まれる要素も、スライスにより一部を取り出して、別のリストを作ることができます。

リスト[開始位置 : 終了位置]

リストのスライスの例を、例文5に示します。

<例文5>

country = ["日本", "米国", "中国", "イギリス", "フランス", "ブラジル", "タイ"]

print(country[:]) #リスト全体
print(country[2:]) #インデックス2から最後まで
print(country[:4]) #最初からインデックス3まで(インデックス4は含まない)
print(country[2:5]) #インデックス2から4まで
['日本', '米国', '中国', 'イギリス', 'フランス', 'ブラジル', 'タイ']
['中国', 'イギリス', 'フランス', 'ブラジル', 'タイ']
['日本', '米国', '中国', 'イギリス']
['中国', 'イギリス', 'フランス']

インデックス番号をマイナスで指定すると、文字列と同様に後ろから指定することができます。(例文6)

<例文6>

country = ["日本", "米国", "中国", "イギリス", "フランス", "ブラジル", "タイ"]

print(country[-1:]) #最後の要素
print(country[-3:]) #後ろから3番目から最後まで
print(country[-3:-1]) #後ろから3番目から後ろから2番目まで
print(country[:-1]) #最後を除いたすべて
['タイ']
['フランス', 'ブラジル', 'タイ']
['フランス', 'ブラジル']
['日本', '米国', '中国', 'イギリス', 'フランス', 'ブラジル']

リストもステップのオプションをつけることができ、等間隔で要素を抜き出すことができます。

リスト[開始位置 : 終了位置 : ステップ]

ステップをマイナスで指定すると、後ろから取り出します。(例文7)

<例文7>

country = ["日本", "米国", "中国", "イギリス", "フランス", "ブラジル", "タイ"]

print(country[::2]) #最初から1個おき
print(country[1:6:2]) #インデックス1からインデクス5まで1個おき
print(country[::-1]) #最後から逆順に取り出す
print(country[::-2]) #最後から逆順に1個おき
['日本', '中国', 'フランス', 'タイ']
['米国', 'イギリス', 'ブラジル']
['タイ', 'ブラジル', 'フランス', 'イギリス', '中国', '米国', '日本']
['タイ', 'フランス', '中国', '日本']

3) タプル

タプルに含まれる要素も、スライスにより一部を取り出して、別のタプルを作ることができます。ステップも同じように設定することができます。

タプル[開始位置 : 終了位置:ステップ]

タプルのスライスはリストとほとんど同じなので、簡単な例を例文8に示します。

<例文8>

country = ("日本", "米国", "中国", "イギリス", "フランス", "ブラジル", "タイ")

print(country[:4]) #最初からインデックス3まで
print(country[::2]) #最初から1個おき
print(country[::-1]) #最後から逆順
('日本', '米国', '中国', 'イギリス')
('日本', '中国', 'フランス', 'タイ')
('タイ', 'ブラジル', 'フランス', 'イギリス', '中国', '米国', '日本')

4) 配列

NumPy配列についても同様に、スライスで要素を取り出すことができます。

配列[開始位置 : 終了位置:ステップ]

配列のスライスもリストとほとんど同じなので、簡単な例を例文9に示します。

<例文9>

import numpy as np

data = np.array([10, 20, 30, 40, 50, 60, 70])

print(data[:]) #すべての要素
print(data[:4]) #最初からインデックス3まで
print(data[2:5]) #インデックス2から4まで
print(data[::2]) #最初から1個おき
print(data[::-1]) #最後から逆順
[10 20 30 40 50 60 70]
[10 20 30 40]
[30 40 50]
[10 30 50 70]
[70 60 50 40 30 20 10]

NumPyは多次元配列を扱うことができますが、多次元配列もスライスすることができます。リストや1次元の配列に比べると複雑になりますが、[行のスライス指定, 列のスライス指定]のように行と列をそれぞれ指定することで、多次元配列内の要素を取り出すことができます。(例文10)

<例文10>

import numpy as np

data = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90])

data2=np.array(data).reshape(3,3) #3×3の配列を作成

data2
array([[10, 20, 30],
       [40, 50, 60],
       [70, 80, 90]])
data2[:2,] #0~1行目のすべての列
array([[10, 20, 30],
      [40, 50, 60]])
data2[:,1:] #すべての行の1列目以降
array([[20, 30],
      [50, 60],
      [80, 90]])
data2[1:,1:] #1行目以降の1列目以降
array([[50, 60],
      [80, 90]])

4. おわりに

シーケンス型のオブジェクトである文字列、リスト、タプル、配列から、一部の要素を取り出すスライス操作を見てきました。

どのオブジェクトでも基本的な書き方は同じですので、すぐに慣れるのではないかと思います。

スライス操作はデータ解析では必須の操作なので、必ずマスターしてください。

5. 参考サイト

【Python】スライス操作についてまとめ

https://qiita.com/tanuk1647/items/276d2be36f5abb8ea52e

Pythonのスライスの使い方を4つのパターンで簡単解説

https://www.sejuku.net/blog/44850
[Python] スライス(slice)の使いかたの基本

https://hibiki-press.tech/learn_prog/python/slice/1

piponではエンジニアの皆様に業務委託や副業でAI・データサイエンスの案件をご紹介しています!

piponの案件にご興味がある方は以下のフォームにご登録ください。案件をご案内します。 https://share.hsforms.com/1qk0uPA_lSu-nUFIvih16CQegfgt