文字列スライスを活用しよう
リストで学んだスライスは、文字列でも同じように使えます。さらに、スライスでは「ステップ」を指定することで、文字列の反転や1文字おきの取得など、より柔軟な操作が可能になります。このレッスンでは、ステップ指定を使った高度なスライス技法を学びます。
文字列でもスライスが使える
Python 入門コースでは、リストのスライス [start:end] を学びました。実は、文字列でも同じようにスライスを使うことができます。
text = "Python" # 012345 print(text[0:3]) # => Pyt print(text[2:5]) # => tho
[start:end] の形式で、start の位置から end の手前までの文字を取得します。リストと同様に、start や end を省略すると、先頭または末尾までを意味します。
text = "Python" # 012345 print(text[:3]) # => Pyt(先頭から) print(text[3:]) # => hon(末尾まで) print(text[:]) # => Python(全体のコピー)
負のインデックスもリストと同様に使えます。
text = "Python" # 012345 print(text[-1]) # => n(最後の文字) print(text[-3:]) # => hon(末尾3文字)
ステップを指定する
スライスには3つ目の値「ステップ」を指定できます。[start:end:step] の形式で、step は何文字おきに取得するかを表します。
text = "0123456789" print(text[0:10:2]) # => 02468
この例では、インデックス 0 から始めて 1 文字おきに取得しています。つまり、インデックス 0, 2, 4, 6, 8 の文字が取り出されます。step の値は「何文字進むか」を表すため、step=2 なら 1 文字おき、step=3 なら 2 文字おきになります。
start と end を省略すると、文字列全体に対してステップが適用されます。
text = "0123456789" print(text[::2]) # => 02468(1文字おきに取得) print(text[::3]) # => 0369(2文字おきに取得)
文字列の反転
ステップに負の値を指定すると、文字列を逆方向に取得できます。[::-1] を使うと、文字列全体を反転できます。
text = "Python" # 012345 print(text[::-1]) # => nohtyP
これは「末尾から先頭に向かって1文字ずつ取得する」という意味です。文字列の反転は、回文(前から読んでも後ろから読んでも同じ文字列)のチェックなどに使われます。
word = "level" if word == word[::-1]: print("回文です") # => 回文です
負のステップと範囲指定
負のステップを使う場合、start と end の指定には注意が必要です。start は end より大きいインデックスを指定します。
text = "Python" # 012345 print(text[4:1:-1]) # => oht
この例では、インデックス 4 から 2 に向かって(インデックス 1 は含まない)、1文字ずつ逆方向に取得しています。
負のインデックスとスライスの組み合わせ
負のインデックスとスライスを組み合わせると、末尾を基準にした柔軟な切り出しができます。
text = "Python" # 012345 print(text[:-2]) # => Pyth(末尾2文字を除く) print(text[-4:-1]) # => tho(末尾4文字目から末尾2文字目まで)
負のインデックスと負のステップを組み合わせることもできます。
text = "Python" # 012345 print(text[-1:-4:-1]) # => noh(末尾から3文字を逆順で)
まとめ
[start:end:step]でステップを指定すると、指定した間隔で文字を取得できる[::2]で1文字おき、[::3]で2文字おきに取得できる[::-1]で文字列を反転できる- 負のステップを使う場合、start は end より大きい値を指定する
- 負のインデックスとスライスを組み合わせると、末尾を基準にした柔軟な操作ができる
演習に挑戦