Python

PythonでiterableをN個づつに分割する関数

More than 3 years have passed since last update.

iterableをN個づつに分割してジェネレータにして返します。

コメントで教えていただいたリンクを参考に改良しました。3行まで短くなり無限リストも扱えてウハウハです。

pythonでイテレータをチャンクに分割する

import itertools

def splitparN(iterable, N=3):
for i, item in itertools.groupby(enumerate(iterable), lambda x: x[0] // N):
yield (x[1] for x in item)

for x in splitparN(range(12)):
print(tuple(x))
"""
出力:
(0, 1, 2)
(3, 4, 5)
(6, 7, 8)
(9, 10, 11)
"""

eternal = libs.splitparN(itertools.cycle("hoge"))
print([tuple(next(eternal)) for x in range(4)])
#出力: [('h', 'o', 'g'), ('e', 'h', 'o'), ('g', 'e', 'h'), ('o', 'g', 'e')]

#itertools.chainで元に戻せます
print(tuple(itertools.chain.from_iterable(splitparN(range(12)))))
#出力: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11)