【Python】Pythonの文字列のスライス【入門第15回】

92, 2019-08-08

目次

文字列のスライス

こんにちは、narupoです。

今回も文字列をやります。
ですが、今回やる内容はあとあとにやる「リスト」や「タプル」でも使えるテクニックです。
つまり、これを覚えておけばひと粒で3度おいしいということですね。

お得!

それで今回はなにをやるのかというと、文字列のスライスについてやりたいと思います。
具体的には↓を見ていきます。

  • スライスとは?

  • スライスの開始位置の指定

  • スライスの終了位置の指定

  • スライスの開始位置と終了位置

  • スライスのステップの指定

スライスとは?

スライスとは、指定範囲の要素を抜き出すことを言います。
たとえば、

:::python
'Hop step jump!'

という文字列があったときに、stepの部分だけを取り出したいとします。
そういうときにスライスは使えます。

じっさいにスライスを使ってstepの部分を切り抜いてみましょう。

:::python
caption = 'Hop step jump!'
caption[4:8]

↑のようにするとstepの部分を抜き出せます。
出力すると、

:::python
print(caption[4:8])

↓のようになります。

step

スライスの構成

スライスは文字列などのデータに対して角かっこ([])でアクセスし、開始位置終了位置ステップを指定します。
それぞれはコロン:で区切って指定します。つまり↓のような構成になります。

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

じっさいに文字列に対してスライスを実行するには↓のようにします。

:::python
caption = 'Hop step jump!'
caption[4:8:1]

開始位置、終了位置、ステップはそれぞれ省略することができます。
つまり、↓のような書き方ができます。

:::python
caption[4::]
caption[:8:]
caption[::1]

最後のステップのコロン:は省略可能です。

:::python
caption[4:]
caption[:8]
caption[:]

開始位置、終了位置、ステップのそれぞれの役割について見ていきたいと思います。

スライスの開始位置の指定

スライスの開始位置には、スライスを始める添え字を指定します。
この添え字は0オリジンです。
開始位置を省略した場合は0番目の添え字になります。

たとえば先頭から4番目の要素からスライスを開始するには↓のようにします。

:::python
caption = 'Hop step jump!'
caption[4:]

文字列Hop step jump!の4番目の要素はsです。ここからスライスがはじまります。
スライスは、終了位置を指定しない場合は文字列の末尾までスライスします。
ですので、

:::python
print(caption[4:])

の出力結果は、

step jump!

になります。

スライスの終了位置の指定

スライスの終了位置には、スライスを終了させる添え字を指定します。
スライスはこの添え字の手前でスライスを終了します。
終了位置を省略した場合は、終了位置は文字列の長さになります。

たとえば先頭から8番目の要素までスライスするには↓のようにします。

:::python
caption = 'Hop step jump!'
caption[:8]

文字列Hop step jump!8番目の要素は、

'Hop step jump!'
         ^
        ここ

ですが、スライスはこの要素の手前までスライスします。
開始位置は、省略した場合は文字列の先頭が指定されます。
なので↓のコードの実行結果は、

:::python
print(caption[:8])

↓のようになります。

Hop step

文字列の先頭から8番目の要素の手前までスライスされているのがわかります。

スライスの開始位置と終了位置

スライスの開始位置と終了位置を同時に指定する場合は↓のようにします。

:::python
caption = 'Hop step jump!'
caption[4:8]

↑の例では文字列の4番目の要素から8番目の要素の手前までスライスしています。
よって↓のコードの実行結果は、

:::python
print(caption[4:8])

↓のようになります。

step

開始位置も終了位置も省略することができます。
両方省略すると、スライスは文字列のコピーを返します。

:::python
caption[:]

ちなみに、strクラスに文字列を渡しても文字列のコピーが帰ってきます。
コピーというのは、複製のことです。

:::python
str(caption)

つまり、↓のコードは同じ意味になります。

:::python
caption[:]
str(caption)

これ、どっちが速いのかというと、じつはスライスのコピーのほうが速いんです。意外ですよね。
↓がスライスのコピーとstrによるコピーを計測したコードです。

:::python
import time

caption = 'Hop step jump!'
limit = 1000000

start = time.time()
for _ in range(limit):
    caption[:]
dif = time.time() - start
print('slice', dif)

start = time.time()
for _ in range(limit):
    str(caption)
dif = time.time() - start
print('str  ', dif)

↑のコードの実行結果は↓のようになります。

slice 0.06109166145324707
str   0.12213420867919922

実行結果は環境によって変わりますが、スライスのコピーのほうが倍近く速いですね。

スライスは速い

スライスのステップの指定

ステップにはスライスを実行するステップ数を指定します。
何も指定しない場合はステップは1になります。
このステップは、じっさいにやってみたほうが理解が速いと思います。

たとえばステップを1にしてスライスを実行するには↓のようにします。

:::python
caption = 'Hop step jump!'
caption[::1]

↓のコードの実行結果は、

:::python
print(caption[::1])

↓のようになります。

Hop step jump!

なんも変わってないやんけ!

はい。ではステップを2に指定してみましょう。

:::python
caption[::2]

↓のコードの実行結果は、

:::python
print(caption[::2])

↓のようになります。

Hpse up

これ、何が起こってるのかと言うと、スライスの刻み方が変わってるんですね。
ステップが1のときは1つずつ要素を抜き出していました。

Hop step jump!
^^^^^^^^^^^^^^
1刻みで抜き出す

これがステップが2になると、こうなります↓。

Hop step jump!
^ ^ ^ ^ ^ ^ ^ 
2刻みで抜き出す

3になるとこうです↓。

Hop step jump!
^  ^  ^  ^  ^
3刻みで抜き出す

使いどころがわからん

ステップに-1を指定して文字列を逆順にする

ステップでよく使うのは-1を指定する方法です。
ステップに-1を指定するとスライスする方向が逆になります。

:::python
caption = 'Hop step jump!'
caption[::-1]

↓のコードの実行結果は、

print(caption[::-1])

↓のようになります。

!pmuj pets poH

文字列が逆順になってますね。
このようにステップに負数を指定するとスライスが末尾から開始されるようになります。

指定範囲を逆にステップしたい場合はたとえば↓のようにします。

:::python
caption[7:3:-1]

開始位置が7で、終了位置が3になっているところに注目してください。
↓のコードの実行結果は、

:::python
print(caption[7:3:-1])

↓のようになります。

pets

つまり、↓のコードの意味は、

:::python
caption[7:3:-1]

「添え字7の要素から、添え字3の要素の手前まで、スライスする」
という意味になりますね。

スライスの戻り値

スライスの戻り値はなんなのでしょうか?
確認してみましょう。

:::python
caption = 'Hop step jump!'
print(type(caption[:]))

↑のコードの実行結果は↓のようになります。

<class 'str'>

str型ですね。

やっぱりな

おわりに

今回は文字列のスライスについて見てきました。
このスライスはリストやタプルなどでも使えるので、憶えておくとお得です。

次回に続きます。

また見てね

関連動画