itertoolsとは何か
参考:https://docs.python.jp/3/library/itertools.html
itertoolsはイテレータを構築する部品を実装していて、
高速でメモリ効率に優れ、単独で組合せても使用することのできるツールを標準化したものです。
イテレータというのはざっと言うとリストの中にある各要素に繰り返しある一定の処理をするものです。
リストの要素を順番にペアにする処理
ペアでなくても、数字を指定すればその数字の要素数でひとかたまりにできます。
zip_longestというイテレータを使います。
参考:https://docs.python.jp/3/library/itertools.html#itertools.zip_longest
itertools.zip_longest(*iterables, fillvalue=None)
1 2 3 4 5 |
>>> list = [1, 2, 3, 4, 5, 6, 7, 8] >>> [i for i in itertools.zip_longest(*[iter(list)]*2)] # 2個1セット [(1, 2), (3, 4), (5, 6), (7, 8)] >>> [i for i in itertools.zip_longest(*[iter(list)]*3)] # 3個1セット [(1, 2, 3), (4, 5, 6), (7, 8, None)] #尻切れたところはNoneが入ります |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>> list = [1, 2, 3, 4, 5, 6, 7, 8] >>> for i in itertools.zip_longest(*[iter(list)]*2): ... print(i) ... (1, 2) (3, 4) (5, 6) (7, 8) >>> for i in itertools.zip_longest(*[iter(list)]*3): ... print(i) ... (1, 2, 3) (4, 5, 6) (7, 8, None) |
ちなみに、余りを捨てても良いのであればzip()で書けます。
1 2 3 4 5 6 7 8 9 10 |
>>> list = [1, 2, 3, 4, 5, 6, 7, 8] >>> for i in zip(*[iter(list)]*3): ... print(i) ... (1, 2, 3) (4, 5, 6) >>> [i for i in zip(*[iter(list)]*3)] [(1, 2, 3), (4, 5, 6)] |