today::エンジニアに憧れる非エンジニア

今のところは、エンジニアとは言えないところの職種です。しかしエンジニア的なものの考え方に興味津津。

Pythonあれこれ 2021-01-23 - Pythonにおけるスライス

概要

「Head First Python 第2版」を進めていった中で考えたことの記録です。

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

Head First Python 第2版 ―頭とからだで覚えるPythonの基本

  • 作者:Paul Barry
  • 発売日: 2018/03/24
  • メディア: 単行本(ソフトカバー)

スライスとは

letters[*開始*:*終了*:*刻み*]

Pythonのシーケンスオブジェクトにおける「スライス」は、「開始・終了・刻みの3つの要素を指定して、シーケンスオブジェクトから情報を取り出す方法」を指します。

以下の箇条書きは、スライスの開始・終了・刻みの説明です。

  • 開始…スライスを開始するインデックス位置
    • 省略時は0を指定したものとみなされる
  • 終了…スライスを終了するインデックス位置
    • 当該インデックス位置の要素そのものは含まない
    • 省略時はリストで利用可能な最大値を指定したものとみなされる
  • 刻み…スライスの間隔
    • 省略時は1を指定したものとみなされる

スライスの戻り値

スライスの戻り値は、元のシーケンスオブジェクトと同じ型となります。

以下のサンプルは、文字列・リスト・タプルに対し、開始・終了・刻みの全てを省略したスライス操作を行った結果です。「戻り値の型は、元のオブジェクトの型と同じになる」という特徴を踏まえて見てみましょう。

print("Don't panic!"[::])
# => "Don't panic!"
print(list("Don't panic!")[::])
# => ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']
print(tuple("Don't panic!")[::])
# => ('D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!')

スライス操作の結果が、「文字列に対して文字列、リストに対してリスト、タプルに対してタプルを戻す」というものであることがわかります。

スライスの実例

saying = "Don't panic!"
letters = list(saying)

print(letters[0:10:3])
# => ['D', "'", 'p', 'i']

print(letters[3:])
# => ["'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']

print(letters[:10])
# => ['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i']

print(letters[::2])
# => ['D', 'n', 't', 'p', 'n', 'c']

それぞれ以下のようなスライスとなります。

  • letters[0:10:3]
    • 開始インデックス位置は0
    • 終了インデックス位置は10(10自身は含まない)
    • 間隔は3
    • => インデックス位置10までの2つおきの文字
  • letters[3:]
    • 開始インデックス位置は3
    • 終了インデックス位置は省略
    • 間隔は省略
    • => 最初3文字を飛ばし、残りすべての文字
  • letters[:10]
    • 開始インデックス位置は省略
    • 終了インデックス位置は10
    • 間隔は省略
    • => インデックス位置10までのすべての文字
  • letters[::2]
    • 開始インデックス位置は省略
    • 終了インデックス位置は省略
    • => 1つおきのすべての文字