LoginSignup
3
4

More than 5 years have passed since last update.

sliceオブジェクトをインデックス番号のリストに変換する

Posted at

Pythonのリストを範囲指定して操作するとき

int_list[10:2]

みたいに表記すると実際に__get__メソッドに渡されるsliceオブジェクトですが、自前でリスト的クラスを実装しようとするときにslice引数に対応しようとするとはたと困ります。sliceをインデックス番号の列に変換するメソッドがないぞと。

自力でそういう変換処理を書こうとすると大変ですね、stepが負の数・Noneの場合、startやstopが負の数・Noneの場合、これは条件分岐の嵐で死ねます。

しかしそういう面倒な処理をやってくれるメソッドが目立たないながら存在します。slice.indices()です。リストの長さを与えるとそれに合わせて負の数・Noneをちゃんとしたインデックス番号に正規化してくれるというもの。これを利用すれば、インデックス番号の列を得るのは比較的簡単です。

def iterate_by_slice(s: slice, length: int):
    i, stop, step = s.indices(length)
    if step > 0 :
        while i < stop:
            yield i
            i += step
    else:
        while i > stop:
            yield i
            i += step

みんなの役に立つリスト的クラス、どんどん作っちゃってください。

3
4
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4