Pythonで配列(list)や文字列(str)など、ひとまとまりの要素の塊の中で、抜き出したい場所を指定する方法にスライス(slice)という便利な方法があります。
スライスは範囲指定や変化量をプラスとマイナスで指定するかで挙動が変わります。
範囲指定や変化量をプラスやマイナスにした場合、プラスとマイナスを混在させた場合、範囲外を指定した場合にどういった挙動になるかをパターン別に実例を用いて解説しています。
スライスとは何か?
listなどの範囲指定方法の一種です。[ ]
と:
で範囲を指定します。
listやfor文でよく目にする [1:5] や [2:] などのことです。listだけでなく、文字列(str)、タプル(tuple)、セット(set)、レンジ(range)などに使うことができます。
連続した要素や、文字を任意の場所で切り出します(スライスする)
なお、スライスの概念はJavaScriptなど他の言語でも共通して使えるものがあります。
スライスの基本構文
[a:b:c]
└「a」:開始の配列番号
└「b」:終了の配列番号(未満)
└「c」:変化量
▼a,b,cはそれぞれ「マイナス」も設定可能
※開始値マイナスの場合は配列番号の割り振りが変わる。
└ 最後の要素を-1として、-1ずつカウントしていく。
└ 最初の要素の番号が一番小さい
※変化量「c」がプラスかマイナスかで「a」と「b」の条件が変わる。
└ 変化量がプラス:常に「a<b」
└ 変化量がマイナス:常に「a>b」
└ 上記でなくともエラーにはならない。該当するデータがない(空になる)。
※「b」で指定した値は含まない。
└ 指定した値で終了するため。
▼各要素は省略することも可能
[:]
:指定なし=すべて[a:]
:開始だけ指定[:b]
:終了だけ指定[a:b]
:開始と終了を指定[a:b:c]
:開始、終了、変化量を指定[a::c]
:開始、変化量を指定[:b:c]
:終了、変化量を指定[::c]
:変化量だけ指定
補足
9. [a::]
:開始だけ指定([a:]と同じ)
10. [:b:]
:開始だけ指定([:b]と同じ)
配列番号の見方
開始値がプラスかマイナスかで配列番号の割り振りが変わる。
(1)開始値がプラスの場合
1-1. list型
1-2. 文字
(2)開始値がマイナスの場合
2-1. list型
2-2. 文字
(3)開始値マイナス、終わり値プラスの場合
(4)範囲外を指定する場合の考え方
開始値がプラスの場合
0番目からカウント。
1-1. list型
例1:a = [1,2,3,4,5]
の場合
データ | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
配列番号 | 0 | 1 | 2 | 3 | 4 |
例2:b = [2020,3,25,"年","月","日"]
の場合
データ | 2020 | 3 | 25 | 年 | 月 | 日 |
---|---|---|---|---|---|---|
配列番号 | 0 | 1 | 2 | 3 | 4 | 5 |
1-2. 文字(要素1つ)
例1:”This is slice”の場合
データ | T | h | i | s | i | s | s | l | i | c | e | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
配列番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
例2:d ="これが、「スライス」 です。"
の場合
データ | こ | れ | が | 、 | 「 | ス | ラ | イ | ス | 」 | で | す | 。 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
配列番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
開始値がマイナスの場合
一番最後のデータを「-1」番目としてカウントしていく。
2-1. list型
例1:a = [1,2,3,4,5]
の場合
データ | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
配列番号 | -5 | -4 | -3 | -2 | -1 |
例2:b = [2020,3,25,"年","月","日"]
の場合
データ | 2020 | 3 | 25 | 年 | 月 | 日 |
---|---|---|---|---|---|---|
配列番号 | -6 | -5 | -4 | -3 | -2 | -1 |
2-2. 文字(要素1つ)
例1:c = "This is slice"
の場合
データ | T | h | i | s | i | s | s | l | i | c | e | ||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
配列番号 | -13 | -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
例2:d ="これが、「スライス」 です。"
の場合
データ | こ | れ | が | 、 | 「 | ス | ラ | イ | ス | 」 | で | す | 。 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
配列番号 | -14 | -13 | -12 | -11 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
マイナスとプラスが混在する場合
■考え方
プラスかマイナスかは、番号の指定をどちらで行うかの違いになる。
・マイナスの場合は、配列番号(-)に該当するデータを参照。
・プラスの場合は、配列番号(+)に該当するデータを参照。
データ | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
配列番号(+) | 0 | 1 | 2 | 3 | 4 |
配列番号(-) | -5 | -4 | -3 | -2 | -1 |
▼例
・開始値「-3」⇒ データは「3」
・終わり値「4」⇒ データは「5」
⇒ 3から5未満。出力は[3, 4]。
▼ポイント
※[-3:4]
は、-3から4を連続で指定していない。「-3,-2,-1,0,1,2,3,4」ではない。
開始値と終わり値に数値が混在する場合は、マイナス番号に相当する、プラスの番号に置き換えるとわかりやすい。
・[-3:4]
= [2:4]
・[-5:4]
= [0:4]
・[1:-1]
= [1:5]
範囲外を指定する場合の考え方
範囲外を指定してもエラーにはならない。
データがない部分は空になる。
スライスをパターン毎に実例で確認
[:]
:指定なし=すべて[a:]
:開始だけ指定[:b]
:終了だけ指定[a:b]
:開始と終了を指定[a:b:c]
:開始、終了、変化量を指定[a::c]
:開始、変化量を指定[:b:c]
:終了、変化量を指定[::c]
:変化量だけ指定
[:] 指定なし=すべて
格納されているデータをすべて出力list(数値)
a = [1, 2, 3, 4, 5]
a[:]
#出力
# [1, 2, 3, 4, 5]
文字
c = 'This is slice'
c[:]
#出力
# 'This is slice'
文字(直接指定)
'This is slice'[:]
#出力
# 'This is slice'
[a:] 開始だけ指定
▼配列番号2番目以上(2から4まで)プラスで指定
a = [1, 2, 3, 4, 5]
a[2:]
#出力
# [3, 4, 5]
▼配列番号-4番目以上(-4から-1まで)マイナスで指定
a = [1, 2, 3, 4, 5]
a[-4:]
#出力
# [2, 3, 4, 5]
▼(補足)各データの配列番号
データ | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
配列番号(+) | 0 | 1 | 2 | 3 | 4 |
配列番号(-) | -5 | -4 | -3 | -2 | -1 |
■範囲外を指定した場合
・エラーにはならない。
・非該当の範囲は空になる。
▼「4」番目までしかないlistで開始値に「6」を指定した場合。(範囲外)プラスで指定
a = [1, 2, 3, 4, 5]
a[6:]
#出力
# []
ヒットなし
▼「-5」から「-1」番目までしかないlistで開始値に「-10」を指定した場合。(範囲外)マイナスで指定
a = [1, 2, 3, 4, 5]
a[-10:]
#出力
# [1, 2, 3, 4, 5]
-10から-6番目までは空。-5番目以上がヒット。
[:b] 終了だけ指定
▼配列番号3番目まで(0から2番目まで)
└ 3未満となる(3番目で終了のため)プラスで指定
a = [1, 2, 3, 4, 5]
a[:3]
#出力
# [1, 2, 3]
▼配列番号-1番目まで(-5から-2番目まで)
└ -1未満となる(-1番目で終了のため)マイナスで指定
a = [1, 2, 3, 4, 5]
a[:-1]
#出力
# [1, 2, 3, 4]
▼(補足)各データの配列番号
データ | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
配列番号(+) | 0 | 1 | 2 | 3 | 4 |
配列番号(-) | -5 | -4 | -3 | -2 | -1 |
[a:b] 開始と終了を指定
▼配列番号1番目から4番目未満を指定。
└ 4は含まない(1から3の3要素)プラスで指定
a = [1, 2, 3, 4, 5]
a[1:4]
#出力
# [2, 3, 4]
▼配列番号-4番目から-2番目未満まで
└ -2を含まない。(-4から-3の2要素)マイナスで指定
a = [1, 2, 3, 4, 5]
a[-4:-2]
#出力
# [2, 3]
▼(補足)各データの配列番号
データ | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
配列番号(-) | -5 | -4 | -3 | -2 | -1 |
■開始値マイナス、終わり値プラスの場合
開始値マイナスの場合は、開始値は配列番号(-)に該当するデータを参照。
終わり値プラスの場合は、終わり値は配列番号(+)に該当するデータを参照。
▼開始値に-3、終わり値に4を指定した場合プラスとマイナスで指定
a = [1, 2, 3, 4, 5]
a[-3:4]
#出力
# [3, 4]
※[-3:4]
は、-3から4を連続で指定していない。「-3,-2,-1,0,1,2,3,4」ではない。
開始値と終わり値に数値が混在する場合は、マイナス番号に相当する、プラスの番号に置き換えるとわかりやすい。
データ | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
配列番号(+) | 0 | 1 | 2 | 3 | 4 |
配列番号(-) | -5 | -4 | -3 | -2 | -1 |
・[-5:4]
= [0:4]
・[1:-1]
= [1:5]
・[-3:2]
= [2:2]
■範囲外を指定した場合
エラーにはならず、該当のないデータは空になる。
▼4番目までしかないデータに対し、終わり値に10番目を指定。範囲外を指定(プラス)
a = [1, 2, 3, 4, 5]
a[3:10]
#出力
# [4, 5]
6番目以降のデータは該当なし。
▼-5番目までしかないデータに対し、開始値に-20を指定。範囲外を指定(マイナス)
a = [1, 2, 3, 4, 5]
a[-20:-3]
#出力
# [1, 2]
-20から-6番目まではヒットなし。
-5から-3番目未満までのデータが出力される。
▼0から4番目までしかないデータで、10から20番目を指定。範囲外から範囲外を指定(プラス)
a = [1, 2, 3, 4, 5]
a[10:30]
#出力
# []
出力は空となる。
▼-1から-5番目までしかないデータで、-20から-10番目を指定。範囲外から範囲外を指定(マイナス)
a = [1, 2, 3, 4, 5]
a[-20:-10]
#出力
# []
出力は空となる。
■プラスとマイナスでそれぞれ範囲外を指定した場合
▼開始値マイナスから終わり値プラスで範囲外を指定。範囲外から範囲外を指定(マイナスとプラス)
a = [1, 2, 3, 4, 5]
a[-20:10]
#出力
# [1,2,3,4,5]
結果は[-5:4]
= [0:4]
と同じになる。
-20
-5未満はデータがないため。-5が最大値。
-5はプラス指定の0番目に該当。
10
4番目以降はデータがないため、4が最大値。
データ | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
配列番号(+) | 0 | 1 | 2 | 3 | 4 |
配列番号(-) | -5 | -4 | -3 | -2 | -1 |
[a:b:c] 開始、終了、変化量を指定
▼開始値1、終わり値9、変化量2を指定した場合。開始、終了、変化量を指定(プラス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[1:9:2]
#出力
# [2, 4, 6, 8]
1番目から2番ずつ配列番号を増やし、9番目未満まで実行。番号に該当するデータを抽出。
変化量をマイナスで指定
▼開始値8、終わり値3、変化量-2を指定した場合。開始、終了、変化量を指定(マイナス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[8:3:-2]
#出力
# [9, 7, 5]
8番目から2番ずつ配列番号を減らし、3番目に来たら終了(3番目は含まない)。番号に該当するデータを抽出。
データ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
配列番号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
すべてマイナスで指定
▼開始値-3、終わり値-8、変化量-2を指定した場合。開始、終了、変化量を指定(マイナス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[-3:-8:-2]
#出力
# [8, 6, 4]
-3番目から2番ずつ配列番号を減らし、-8番目に来たら終了(-8番目は含まない)。番号に該当するデータを抽出。
データ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
配列番号 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
[a::c] 開始と変化量を指定
▼開始値1、変化量3を指定した場合開始と変化量のみ指定(プラス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[1::3]
#出力
# [2, 5, 8]
1番目から3番づつ番号を増やし、データがあるところまで実行。
▼開始値5、変化量-1を指定した場合開始と変化量のみ指定(マイナス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[5::-1]
#出力
# [6, 5, 4, 3, 2, 1]
5番目から1番づつ番号を減らし、データがあるところまで実行。
[:b:c] 終了と変化量を指定
変化量がプラスかマイナスかで、開始値が異なる。
▼終了値5、変化量2を指定した場合(開始値0)終了と変化量のみ指定(プラス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[:5:2]
#出力
# [1, 3, 5]
開始値0番目から2番づつ番号を増やし、5番目未満まで実行(5番目は含まない)。
▼終了値5、変化量-2を指定した場合(開始値は最後のデータ)終了と変化量のみ指定(プラス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[:5:-2]
#出力
# [10, 8]
開始値9番目から2番づつ番号を減らし、5番目未満まで実行(5番目は含まない)。
[::c] 変化量だけ指定
変化量がプラスかマイナスかで、開始値が異なる。
▼変化量プラスの場合(開始値0)変化量のみ指定(プラス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[::3]
#出力
# [1, 4, 7, 10]
開始値0番目から3番づつ番号を増やし、データがあるところまで実行。
▼変化量マイナスの場合(開始値は最後のデータ)変化量のみ指定(マイナス)
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
a[::-3]
#出力
# [10, 7, 4, 1]
**開始値1
0番目**から3番づつ番号を減らし、データがあるところまで実行。
エラー事例
int型(整数)やfloat型(小数点)などスライスできないオブジェクトも存在する。エラー事例(int型)
1001[2:]
#出力
# TypeError: 'int' object is not subscriptable
エラー事例(float型)
123.45[2:5]
#出力
# TypeError: 'float' object is not subscriptable