スライス / Python Tips.
スライスとは
Pythonの組み込み型であるシーケンス型のオブジェクトを操作するための記法です。
スライス表記 (slicing)と言うみたいですね。
みてくれはこんな感じ。
sequence = ["a", "b", "c", "d", "e"]
sliced = sequence[0:3]
>>> sliced
['a', 'b', 'c']
スライスの名の通り、切り出しを行うことが出来ます。
基本の使い方
シーケンスオブジェクト[開始インデックス:終了インデックス]
のように書きます。
シーケンス型であればスライスできるので、
# str(文字列)型
"Hello!"
# list(リスト)型
[1, 2, 3, 4, 5]
# tuple(タプル)型
(1, 2, 3, 4, 5)
# range(レンジ)型
range(0, 101)
この4つの組み込み型に対して使用することが出来ます。
上記の4つのオブジェクトに対して同じ条件でスライスしてみると・・・
s = "Hello!"
l = [1, 2, 3, 4, 5]
t = (1, 2, 3, 4, 5)
r = range(0, 101)
print(s[1:4])
print(l[1:4])
print(t[1:4])
print(r[1:4])
>>>
ell
[2, 3, 4]
(2, 3, 4)
range(1, 4)
こんなかんじ。
基本的にインデックスは0始まりなので、開始インデックスは0、終了インデックスの1つ手前までを切り出す感じですね。(上記の場合は0から3までの4つ)
なので、終了インデックスは「何個切り出すか」で考えるとわかりやすいかもしれません。
いろいろな使い方
実はスライスの書き方はこれだけじゃありません。
1. 省略記法
インデックスを指定しないことで省略が出来ます。
# 4つ目からいちばん最後まで
>>> "hello_world"[3:]
'lo_world'
# 0から3つ目まで
>>> "hello_world"[:3]
'hel'
# すべて
>>> "hello_world"[:]
'hello_world'
2. 負の値
負の値を指定することで一番最後から数えたインデックスとして指定できます。
# 3つ目からシーケンスの長さ-2まで
"hello_world"[2:-2]
'llo_wor'
# 省略記法との合わせ技
"hello_world"[:-2]
'hello_wor'
# もちろん開始インデックスに負の値を使うこともできる
>>> "hello_world"[-4:]
'orld'
3. ステップ
シーケンスオブジェクト[開始インデックス:終了インデックス:ステップ]
のように、: (コロン)をもう一つ追加したあとに整数を指定すると、その数値分の間隔を開けて切り出してくれます。
これを利用すると、インデックスが偶数なもの、または奇数なものを取り出したりすることが出来たりします。
# 偶数だけ取り出す
>>> "0123456789"[2:10:2]
'2468'
# 奇数だけ取り出す
>>> "0123456789"[1:10:2]
'13579'
もちろん省略記法が使えます。
>>> "0123456789"[::2]
'02468'
>>> "0123456789"[1::2]
'13579'
4. 合わせ技
ステップと負の値を利用すると・・・
# 最後から3つずつステップする
>>> "0123456789"[::-3]
'9630'
これを利用すると、全て逆転したものを簡単に取り出すことが出来ます。
この記法を覚えておくとかなりスマートにリバースできます。
(ただ、この記法を知らない人が読むとナンノコッチャ?ってなります)
>>> "我、夜戦に突入す!なのです!"[::-1]
'!すでのな!す入突に戦夜、我'
ちなみに、スライスを使わずリバースしたいなら、
>>> ''.join(reversed("我、夜戦に突入す!なのです!"))
'!すでのな!す入突に戦夜、我'
こうです。
おわり