0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

イテレータを一定個数ごとに分割する

Last updated at Posted at 2022-07-15

目的

イテレータから値を取り出して順次処理する際に、一定個数ごとにバッチ的な処理を行うこと。

方法

表題の通り、元のイテレータを一定個数ごとのイテレータに分割する。
ただし、メモリ上に複数の値を保持しない方法で実装する。

タプルで例えるなら以下。

# 元のイテレータ
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

# n個ごとのイテレータに分割し、それをラップしてイテレートする (以下はn=4の場合)
((0, 1, 2, 3), (4, 5, 6, 7), (8, 9))

コード

iter.py
"""イテレータから特定個数ずつに分けたイテレータをイテレートするサンプル."""

from typing import Iterator, TypeVar

T = TypeVar("T")


def iterate_iter(iter: Iterator[T], iter_size: int) -> Iterator[Iterator[T]]:
    """イテレータから特定個数ずつに分けたイテレータをイテレートする."""
    if iter_size < 1:
        raise ValueError("iter_size must be 1 or greater.")

    def inner(init: T) -> Iterator[T]:
        yield init
        for _, v in zip(range(iter_size - 1), iter):
            yield v

    while True:
        try:
            init = next(iter)
        except StopIteration:
            break
        yield inner(init)

使用例

main.py
"""使用例."""

from iter import iterate_iter

if __name__ == "__main__":

    iters = iterate_iter((f"No.{i}" for i in range(10)), 4)

    for i, iter in enumerate(iters):
        print(f"inner iterator_{i} start.")
        for value in iter:
            print(value)

$ python main.py 
inner iterator_0 start.
No.0
No.1
No.2
No.3
inner iterator_1 start.
No.4
No.5
No.6
No.7
inner iterator_2 start.
No.8
No.9
0
0
0

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?