いろいろ備忘録日記

主に .NET とか Java とか Python絡みのメモを公開しています。

Pythonメモ-29 (slice)(特定のシーケンスのrangeを表すオブジェクト, スライスオブジェクト)

概要

よく忘れるので自分用にメモメモ。

pythonの組み込み関数に slice というのがあります。

名前の通り、指定された範囲のスライスを表すオブジェクトを作ってくれます。

通常だと

l = list(range(10))
print(l[2:4])

と記述するところを

l = list(range(10))
from_two_to_four = slice(2, 4)
print(l[from_two_to_four])

と出来ます。なにげにシーケンスの添字指定って

分かりづらいときがおおいので、名前を付けて指定できるのは

分かりやすくて好きです。

サンプル

# coding: utf-8
"""
slice 関数についてのサンプルです。
"""
import itertools
from trypython.common.commoncls import SampleBase


class Sample(SampleBase):
    def exec(self):
        #############################################################
        # slice 関数
        #   - https://docs.python.jp/3/library/functions.html#slice
        #
        # slice 関数は、インデックスの集合を表すオブジェクトを生成し返す.
        # 取得した slice オブジェクトはシーケンスの添字として利用できる.
        #############################################################
        l = list(range(10))

        # インデックス2番目から4番目までの要素を取得
        print(l[2:4])

        # slice オブジェクト取得
        # 生成した slice オブジェクトはシーケンスの添字として利用可能
        # 名前が付けられるので、sequence[x:y:z]とするよりわかりやすい
        from_two_to_four = slice(2, 4)
        print(type(from_two_to_four))
        print(l[from_two_to_four])
        print('helloworld'[from_two_to_four])

        # slice 関数に渡す引数は、前から start, stop, step となっている
        step_two = slice(None, None, 2)
        print('helloworld'[step_two])

        # イテレータに対しては、itertools.islice を使う
        it = iter(l)
        iter_from_two_to_end_step_two = itertools.islice(it, 0, None, 2)
        print([x for x in iter_from_two_to_end_step_two])


def go():
    obj = Sample()
    obj.exec()


if __name__ == '__main__':
    go()

結果は以下のようになります。

[2, 3]
<class 'slice'>
[2, 3]
ll
hlool
[0, 2, 4, 6, 8]

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。