スライスを使ったデータ抽出


こんにちは、切口太郎です。

今日は Python のデータを扱う上で便利なスライス(部分)アクセスについてです。

Python は、次のデータ型は、スライスアクセスができます。

1
文字列
2
リスト
3
タプル
4
集合

スライスのアクセス方法はどれも同じで、次の構文により指定します。

変数名[ 開始位置 : 終了位置 ステップ数 ]

実際には、このように記述します。

name[0:1:1]
lst[0:1:1]

スライスの考え方



Python の文字列は、1文字づつ格納している配列と考えることができます。
配列には、添字番号(位置)があるので、左から順に0から文字の終端まで順に番号が振られます。

リスト、タプル、集合なども同様に要素を格納している配列になっているので、左から順に配列の添字番号(位置)があります。


この位置を指定して、部分的にデータを取得するのがスライスの考え方です。

例えば、文字列の場合、開始位置を0、終了位置を1に指定すると、’K' を取り出します。
同じようにリストに開始位置を0、終了位置を1に指定すると、"abc" を取り出します。


>>> name="Kirikuchi"
>>> lst=["abc" , "def" , "ghi" , "jkl" , "mn" , "opq" , "rst" , "uv" , "wxy"]
>>> name[0:1:1]
'K'
>>> lst[0:1:1]
['abc']

スライスの指定の仕方は、先程のデータ型すべて同一なので、覚えるととても応用範囲が広がります。


スライスの指定方法


スライスには、開始位置、ステップ数、終了位置の指定方法がありますが、どれも省略ができます。

位置指定
省略時の値
説明
開始位置
1
スライスの開始位置を指定します。
マイナスを指定すると、終端からの先頭に向かって位置指定をすることになります。
終了位置
末尾
スライスの終了位置を指定します。
マイナスを指定すると、終端からの先頭に向かって位置指定をすることになります。
ステップ数
1
スライスの取得間隔を指定します。
マイナスを指定すると、終端から先頭方向に向かって移動します。

開始位置と終了位置


開始位置と終了位置の指定方法です。開始位置と終了位置で、スライスの範囲を指定します。
開始位置と終了位置を指定すると、ほぼ自由にデータのスライス取得ができます。


>>> num = (1,2,3,4,5,6,7,8,9,10)
>>> num[0:3]
(1, 2, 3)
>>> num[4:7]
(5, 6, 7)
>>> num[5:-2]
(6, 7, 8)




図で書くとこんな感じです。
わかりにくいのが、終了位置にマイナスを指定した場合ですね。

配列は、0から9まであります。
終端が9です。
-2 を終了位置に指定すると、(9-2) で7を指定したことになりますので、num[5:7] と同じになります。
終端を指定したい場合には、終了位置を省略します。


>>> num[5:]
(6, 7, 8, 9, 10)

終了位置の省略ですが、num[5:] のコロンを省略してしまうと、結果が変わってしまいます。

>>> num[5]
6

配列の5番目だけを取得します。

マイナスを指定する場合ですが、常に終端から先頭方向に向かって計算します。
つまり、-1 は、開始位置でも終了位置でも、終端から先頭に1つ移動した位置になります。

>>> num[-5:-1]
(6, 7, 8, 9)

ステップの指定


ステップの指定でよくある説明、奇数と偶数を取得する方法を見てみましょう!


>>> num[0::2]    #①
(1, 3, 5, 7, 9)
>>> num[1::2]    #②
(2, 4, 6, 8, 10)
>>>    

①の指定は、
開始位置=先頭、
終了位置=終端
ステップ=2

先頭は、1から始まっていますので、奇数を表示します。
②は開始位置が1 から始まっています。1には2が入っているので、偶数を表示しています。

ステップは、次の位置が先頭からいくつ先に移動させるかを指定しています。

ステップが1であれば、配列の順に1つづつ終端まで表示します。

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




ステップは、マイナス値を指定できます。マイナス値を指定した場合には、終端から先頭へ向かって(リバース)移動します。




>>> num[:0:-1]
(10, 9, 8, 7, 6, 5, 4, 3, 2)

あまり使わなかなとは思いますが、値をひっくり返したい時に利用できますね。



Python でリストや文字などの部分抽出で便利なスライスについてお話しました。
この機能は、よく利用されます。

ソースを見ているとちょくちょく拝見しますが、なんか変な記号のように感じてとっつきにくいですが、意味を理解しながら覚えていけば、使いやすい機能です。


コメント

このブログの人気の投稿

Python のファイルアクセス

Lambda について

Visual Studio Code での Python 開発のポイント