目的
イテレータから値を取り出して順次処理する際に、一定個数ごとにバッチ的な処理を行うこと。
方法
表題の通り、元のイテレータを一定個数ごとのイテレータに分割する。
ただし、メモリ上に複数の値を保持しない方法で実装する。
タプルで例えるなら以下。
# 元のイテレータ
(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